Seite 1 von 2
QPainterEvent
Verfasst: 11. November 2004 10:46
von bar
Hallo alle zusammen!
Ich habe gerade eine kleine Klasse geschrieben, die QPaintEvent benutzen soll.
Aber leider beim Aufrufen von update() oder repaint(true) meine Methode
paintEvent(QPaintEvent* e) wird nicht aufgerufen... (ich habe durchdebuggt)
Woran kann das liegen?
Vielleicht hat jemand dieses Problem gehabt?
Danke!
Verfasst: 11. November 2004 11:00
von Spring-Daniel
Zeig doch mal ein bisschen Code (:
Verfasst: 11. November 2004 11:11
von bar
ok, hier einbisschen vom code:-)
case Animated:
hide();
repaint(true);
break;
und dann:
void Screen::paintEvent(QPaintEvent* e)
{
QPixmap* pix = new QPixmap("anima.png");
bitBlt(this,0,0,pix,0,0,800,480,CopyROP);
show();
}
Danke!
Verfasst: 11. November 2004 11:30
von Goos
Punkt 1 - In der Klassendefinition deines Widgets steht dein "void paintEvent(QPaintEvent* e)" nicht unter private? (also paintEvent wird ueberhaupt nie aufgerufen, oder nur nach deinem update nicht?)
Punkt 2 - Wie willst du ueberpruefen, dass dein paintEvent nicht aufgerufen wird? ...oder besser, wie versuchst du das gerade zu ueberpruefen? Ich halte so eine Ueberpruefung naemlich nicht fuer trivial.
Goos
Verfasst: 11. November 2004 11:36
von lepsai
[quote="Goos"]Wie willst du ueberpruefen, dass dein paintEvent nicht aufgerufen wird? ...oder besser, wie versuchst du das gerade zu ueberpruefen? Ich halte so eine Ueberpruefung naemlich nicht fuer trivial.

Goos[/quote]
Hmm... schon mal vom Debugger gehört?

Verfasst: 11. November 2004 11:40
von Goos
Ok, vielleicht nicht toll ausgedrueckt, aber es heisst schliesslich paintEVENT

....und ich meinte wohl, wie er ueberpruefen will, dass der Aufruf gerade von seinem update() bzw repaint() kommt. Ganz allgemein zu pruefen, ob der Debugger 99,9% seiner Zeit im paintEvent haengt, das is natuerlich kein problem
Goos
Verfasst: 11. November 2004 11:46
von lepsai
Ja, das ist tatsächlich etwas ungbequem, geht aber, in dem man zuerst in dem Debugger zu dem eigenen update()-Aufruf springt, alle Fenster der Anwendung, die man grade debuggt,durch das Fenster von dem Debugger verdeckt und dann im Debugger einen Schritt weiter geht.
Springt man dann in painEvent() ein, handelt es sich eindeutig um den richtigen paintEvent() Aufruf. So mache ich das jedenfalls mit VS 6.0 unter windoz.
Verfasst: 11. November 2004 12:00
von bar
hi,
habe tatsächlich so gemacht (mit Debuggen),
geht in die paintEvent nicht rein:-(
1) meine Methode ist protected!
2) ich habe extra noch ein QPushButton geschrieben, kein Effect:-(
Verfasst: 11. November 2004 12:04
von lepsai
case Animated:
hide();
repaint(true);
break;
He, nimm mal dieses hide() raus...
Verfasst: 11. November 2004 13:39
von bar
danke, funktioniert tatsächlich !
aber ich habe jetzt das andere Problem...
QPixmap* pix = new QPixmap("anima.png");
bitBlt(this,0,0,pix,0,0,800,480,CopyROP);
in mein Widget wird kein Pixmap gezeichnet?!
Wenn ich ein Bild mit QLabel erstelle (label->setPixmap(pix)), dann kommt es raus, anderes mit bitBlt nicht?! Aber ich brauche unbedingt DoppelBuffering...
Vielleicht hast Du eine Idee?!
Vielen Dank!
Verfasst: 11. November 2004 13:46
von lepsai
Von welcher Qt Klasse ist deine Widget Klasse abgeleitet?
Wenn von QScrollView, dann heißt es viewport() statt this:
bitBlt( viewport(), 0,0,pix,0,0,800,480,CopyROP);
Verfasst: 11. November 2004 13:56
von bar
Mein Widget ist von QWidget abgeleitet.
QWidget* m_animatedwidget = new QWidget(this);
bitBlt(m_animatedwidget,0,0,pix,0,0,800,480,CopyROP);
So sieht eigentlich aus...
Danke!
Verfasst: 11. November 2004 13:58
von lepsai
und wo genau steht dieser Aufruf?
bitBlt(m_animatedwidget,0,0,pix,0,0,800,480,CopyROP);
Verfasst: 11. November 2004 14:04
von bar
void Screen::paintEvent(QPaintEvent* e)
{
bitBlt(m_animatedwidget,0,0,pix,0,0,800,480,CopyROP);
m_animatedwidget->show();
}
etwas läuft schief..
Verfasst: 11. November 2004 14:10
von lepsai
Ne, ne, so geht es nicht...
So muss es sein:
Screen::Screen()
{
m_animWidget = new MySuperWidget(this);
m_animWidget->show();
}
für Screen brauchen wir nix mehr tun
Dann:
class MySuperWidget : public QWidget
{
protected:
void paintEvent(QPaintEvent *e)
{
// und hier dann dein bltBit() Kram...
}
};