Merkwürdiges paintEvent()?!

Alles rund um die Programmierung mit Qt
Antworten
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Merkwürdiges paintEvent()?!

Beitrag von slash-ex »

Ich habe zwei kleine Fragen. Zur ersten: mich verwirrt die paintEvent(QPaintEvent * ) -Funktion. Wird diese Funktion von jeder auf QWidget basierenden Klasse immer automatisch aufgerufen? Da ja wie von Geisterhand und ohne connect diese Funktion und damit der Text gezeichnet wird.
Meine zweite Frage beschäftigt sich mit

QPainter painter(this);
painter.drawText(100, 200, tr("hallo") );

Warum wird der Text nur in der paintEvent-Funktion gezeichnet und nicht wenn man Funktionskörper in den Kontruktor packt? Müsste doch das Selbe sein?!

Code: Alles auswählen

CannonField::CannonField(QWidget *parent)
    : QWidget(parent)
{
    currentAngle = 45;
    setPalette(QPalette(QColor(250, 250, 200)));
    setAutoFillBackground(true);

    QPainter painter(this);
    painter.drawText(100, 200, tr("hallo") );
}

void CannonField::setAngle(int angle)
{
    if (angle < 5)
        angle = 5;
    if (angle > 70)
        angle = 70;
    if (currentAngle == angle)
        return;
    currentAngle = angle;
    update();
    emit angleChanged(currentAngle);
}

void CannonField::paintEvent(QPaintEvent * )
{
    QPainter painter(this);
    painter.drawText(200, 200, tr("Angle = ") + QString::number(currentAngle));
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Man kann nur innerhalb von paintEvent() etwas zeichnen.
http://doc.trolltech.com/4.1/qwidget.html#paintEvent
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

paintEvent ist ein Event und Events haben (fast) nichts mit Signal-Slots zu tun. Events werden von QApplication generiert und per postEvent an die QObjects gesendet.

http://doc.trolltech.com/4.2/eventsandfilters.html
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

Ich habe mich heute schon mit events beschäftigt. Ich habe die bisher vollkommen ignoerier, bis bei den Tutorial auf sie gstoßen bin. Ich denke, dass ich erstmal alle Tuts lesen werde. Aber an sich finde ich sie äußerst praktisch. Schonmal danke. Es ist unvorstellbar was Qt alles beinhaltet...
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

mir ist noch etwas kurioses aufgefallen. also painting ist nur über das paintevent() möglich. nun, habe ich das ganze in eine normale event-funktion gepackt....abzusehen war, dass das ganze nicht so ganz klappt. das bild wird wie abgesehen(und wie es qt als konsolenausgabe ausgibt nicht gezeichnet)!
nun habe ich die update()-fkt. aber eingetauscht. und zwar benutze ich jetzt repaint.... also wird bei jedem aufruf dieses slots das widget neu gezeichnet. mal abgesehn von den warnungen die mir qt dann um die ohren haut. ist das genauso gut, oder sollte man prinzipiel die passenden *Events()-fkt. benutzen?

Code: Alles auswählen

CannonField::CannonField(QWidget *parent)
    : QWidget(parent)
{
    currentAngle = 45;
    setPalette(QPalette(QColor(250, 250, 200)));
    setAutoFillBackground(true);
}

void CannonField::setAngle(int angle)
{
    if (angle < 5)
        angle = 5;
    if (angle > 70)
        angle = 70;
    if (currentAngle == angle)
        return;
    currentAngle = angle;
    //update();
    repaint();       //getauscht
    emit angleChanged(currentAngle);
}

bool CannonField::event(QEvent *event)    //man sieht den unterschied
{
    //if(event->type() == QEvent::Paint)
    //{
        std::cout<<"alles gut"<<std::endl;

        QPainter painter(this);
        painter.drawText(100, 200, tr("hallo") );
        painter.drawText(200, 200, tr("Angle = ") + QString::number(currentAngle));


        painter.translate(0, rect().height());
        painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16);
        painter.rotate(-currentAngle);
        painter.drawRect(QRect(30, -5, 20, 10));

        return true;
    //}
    //return false;
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und wenn du dir den Qt-Code von QWidget anschaust, wirst du feststellen, daß dort in der event()-Funktion auch nichts anders gemacht wird, als die paintEvent() aufzurufen (gilt natürlich auch für die anderen event-Funktionen)
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

achso :?
Antworten