[gelöst] runde Fenster

Alles rund um die Programmierung mit Qt
Antworten
Saiyaman
Beiträge: 111
Registriert: 20. Mai 2005 13:52

[gelöst] runde Fenster

Beitrag von Saiyaman »

Habeich eine Möglichkeit, die Form des Fensters zu beeinflussen, ähnlich wie hier:

http://www.vbarchiv.net/workshop/workshop04.php

?

MfG
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Ja, wenn du paintEvent() oder QStyle-Funktionen überschreibst.
Saiyaman
Beiträge: 111
Registriert: 20. Mai 2005 13:52

Beitrag von Saiyaman »

Das ist schonmal fein, dass das geht.

Gibts dafür gute Tutorials?

MfG
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Ich kenne jedenfalls keine...
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Also ich kenne jetzt auch auswendig keines, aber ich habe Teile von Winamp für Unix nachprogrammiert, hier mal ein paar Ideen:

Für Fenster ohne Rahmen:

Code: Alles auswählen

Xgq3Base::Xgq3Base( QWidget *parent, const char *name ) : QWidget( parent, name, WStyle_Customize | WStyle_NoBorder )
Für Bilder, die bei Transparentz abgeschnitten werden (Am besten in paintEvent aufgehoben):

Code: Alles auswählen

QString mainIncludes = "/home/floh/.xgq/Skins/winamp3_default/xml/player-normal.xml";
	bgImage = "/home/floh/.xgq/Skins/OHE3/player/background.png";
	QImage img(bgImage);
	QImage img2(img.width(), img.height(), 1, 2, QImage::LittleEndian);
	img2.setColor(0, qRgb(0, 0, 0));
	img2.setColor(1, qRgb(255, 255, 255));
	
	for (int height = 0; height < img.height(); height++)
	{
		for (int width = 0; width < img.width(); width++)
			setPixel1BPP(img2, width, height, qAlpha(img.pixel(width, height)) >= 70);
	}
	QBitmap mask;
	mask.convertFromImage(img2);
	setMask(mask);
Hier noch die wirkliche Funktion, die die durchsichtigen Pixel löscht:

Code: Alles auswählen

void Xgq3Base::setPixel1BPP(QImage &image, int x, int y, bool value)
{
	if ( image.bitOrder() == QImage::LittleEndian )
	{
		if (value)
			*(image.scanLine(y) + (x >> 3)) |= 1 << (x & 7);
		else
			*(image.scanLine(y) + (x >> 3)) &= ~(1 << (x & 7));
	}
	else
	{
		if (value)
			*(image.scanLine(y) + (x >> 3)) |= 1 << (7-(x & 7));
		else
			*(image.scanLine(y) + (x >> 3)) &= ~(1 << (7-(x & 7)));
	}
}
Anmerkung:
Der Code ist ein wenig älter und da ich gerne auskommentiere, herumprobiere und teilweise Änderungen die nicht funktionieren so lasse könne es durchaus sein, dass das so nicht funktioniert. Aber von Prinzip her ist es perfekt. Was nicht funktionieren könne sind die Dinge im paintEvent, der Rest sollte völlig problemlos laufen.
Antworten