[QT3] Flimmereffekt beim Zeichnen
Verfasst: 25. Januar 2008 09:19
Hallo zusammen,
ich habe eine eine Buttonklasse die von QButton abgeleitet ist. In meiner Klasse überschreibe ich die <<drawButton(QPainter*)>> Methode.
Sobald ich den Fokus von der Applikation wechsle oder wieder zur QT Applikation zurückwechsle, werden alle Buttons nochmals gezeichnet und dies sieht man(kleines auflimmern bei jedem Button ca. 30St.).
zur Info:
eigentlich erstelle ich mit der Klasse nur zwei verschiedene Bilder, generiere ein Zwischenbild(Transparent) und stelle dieses dar.
getTransparencyImage(...) macht zwischen dem Screenshot und dem übergebenen Bild ein transparentes Bild(je nach Faktor).
drawInButton(...) zeichnet nur ein paar Zeichen in das Bild
MyButtonClass : public QButton
Hoffe jemand kann mir da ein paar Tips geben
ich habe eine eine Buttonklasse die von QButton abgeleitet ist. In meiner Klasse überschreibe ich die <<drawButton(QPainter*)>> Methode.
Sobald ich den Fokus von der Applikation wechsle oder wieder zur QT Applikation zurückwechsle, werden alle Buttons nochmals gezeichnet und dies sieht man(kleines auflimmern bei jedem Button ca. 30St.).
zur Info:
eigentlich erstelle ich mit der Klasse nur zwei verschiedene Bilder, generiere ein Zwischenbild(Transparent) und stelle dieses dar.
getTransparencyImage(...) macht zwischen dem Screenshot und dem übergebenen Bild ein transparentes Bild(je nach Faktor).
drawInButton(...) zeichnet nur ein paar Zeichen in das Bild
MyButtonClass : public QButton
Code: Alles auswählen
MyButton::MyButton (QWidget* apo_parent)
: m_ButtonIsPressed(false),
m_IsSmallButton(false),
QButton(apo_parent)
{
connect(this, SIGNAL(clicked()), this, SLOT(clicked()));
connect(this, SIGNAL(pressed()), this, SLOT(pressed()));
connect(this, SIGNAL(released()), this, SLOT(released()));
}
MyButton::~MyButton()
{
}
void MyButton::pressed ()
{
m_ButtonIsPressed = true;
update();
}
void MyButton::released ()
{
if(m_ButtonIsPressed)
{
m_ButtonIsPressed = false;
update();
}
}
void MyButton::clicked ()
{
if(m_ButtonIsPressed)
{
m_ButtonIsPressed = false;
update();
}
}
void MyButton::drawButton (QPainter* apo_painter)
{
QPixmap o_newPixmap;
if(m_ButtonIsPressed)
{
o_newPixmap = m_PressedPixmap;
}
else
{
o_newPixmap = m_Pixmap;
}
QPaintDevice* po_orgPainterDevice = apo_painter->device();
apo_painter->end();
apo_painter->begin(&o_newPixmap);
drawInButton(apo_painter);
apo_painter->end();
apo_painter->begin(po_orgPainterDevice);
QRect o_rect;
QPoint o_point(0,0);
o_rect.setTopLeft(mapToGlobal(o_point));
o_rect.setWidth(o_newPixmap.width());
o_rect.setHeight(o_newPixmap.height());
QImage o_transparencyPic = getTransparencyImage(o_rect,o_newPixmap,1);
apo_painter->drawImage(0,0,o_transparencyPic);
}
QImage MyButton::getTransparencyImage (QRect ao_buttonGeometry, QPixmap ao_buttonPixmap, double ad_transparencyFactor)
{
int i_imageWidth = ao_buttonPixmap.width();
int i_imageHeight = ao_buttonPixmap.height();
QPixmap o_screenShot = QPixmap::grabWindow(QApplication::desktop()->winId(),
ao_buttonGeometry.x(),
ao_buttonGeometry.y(),
m_Pixmap.width(),
m_Pixmap.height());
QImage o_backgoundImage = o_screenShot.convertToImage();
QImage o_foregroundImage = ao_buttonPixmap.convertToImage();
QImage o_drawImage = o_foregroundImage;
QRgb o_backgroundPixel, o_foregroundPixel;
int i_red,i_green,i_blue;
if(ad_transparencyFactor >= 0.99)
{
//do nothing
}
else if(ad_transparencyFactor <= 0.01)
{
o_drawImage = o_backgoundImage;
}
else
{
for(int i_x = 0 ; i_x < i_imageWidth ; i_x++)
{
for(int i_y = 0 ; i_y < i_imageHeight ; i_y++)
{
o_backgroundPixel = o_backgoundImage.pixel(i_x,i_y);
o_foregroundPixel = o_foregroundImage.pixel(i_x,i_y);
if(qRed(o_foregroundPixel) != 150 &&
qGreen(o_foregroundPixel) != 149 &&
qBlue(o_foregroundPixel) != 148)
{
i_red = (int)( ad_transparencyFactor * (double)(qRed(o_foregroundPixel)) + (1-ad_transparencyFactor) * (double)(qRed(o_backgroundPixel)));
i_green = (int)( ad_transparencyFactor * (double)(qGreen(o_foregroundPixel)) + (1-ad_transparencyFactor) * (double)(qGreen(o_backgroundPixel)));
i_blue = (int)( ad_transparencyFactor * (double)(qBlue(o_foregroundPixel)) + (1-ad_transparencyFactor) * (double)(qBlue(o_backgroundPixel)));
o_drawImage.setPixel(i_x,i_y , qRgb(i_red,i_green,i_blue));
}
}
}
}
return o_drawImage;
}