QPainterEvent

Alles rund um die Programmierung mit Qt
bar
Beiträge: 15
Registriert: 12. Oktober 2004 10:25

QPainterEvent

Beitrag 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!
Spring-Daniel
Beiträge: 40
Registriert: 4. Oktober 2004 16:26

Beitrag von Spring-Daniel »

Zeig doch mal ein bisschen Code (:
bar
Beiträge: 15
Registriert: 12. Oktober 2004 10:25

Beitrag 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!
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag 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
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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? :)
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag 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 :D

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

Beitrag 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.
bar
Beiträge: 15
Registriert: 12. Oktober 2004 10:25

Beitrag 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:-(
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

case Animated:
hide();
repaint(true);
break;

He, nimm mal dieses hide() raus...
bar
Beiträge: 15
Registriert: 12. Oktober 2004 10:25

Beitrag 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!
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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);
bar
Beiträge: 15
Registriert: 12. Oktober 2004 10:25

Beitrag 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!
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

und wo genau steht dieser Aufruf?

bitBlt(m_animatedwidget,0,0,pix,0,0,800,480,CopyROP);
bar
Beiträge: 15
Registriert: 12. Oktober 2004 10:25

Beitrag 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..
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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...
}
};
Antworten