Seite 1 von 1

[gelöst] runde Fenster

Verfasst: 25. Mai 2005 12:47
von Saiyaman
Habeich eine Möglichkeit, die Form des Fensters zu beeinflussen, ähnlich wie hier:

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

?

MfG

Verfasst: 25. Mai 2005 14:22
von lepsai
Ja, wenn du paintEvent() oder QStyle-Funktionen überschreibst.

Verfasst: 25. Mai 2005 15:09
von Saiyaman
Das ist schonmal fein, dass das geht.

Gibts dafür gute Tutorials?

MfG

Verfasst: 25. Mai 2005 15:13
von lepsai
Ich kenne jedenfalls keine...

Verfasst: 25. Mai 2005 17:55
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.