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.