Seite 1 von 1

Merkwürdiges paintEvent()?!

Verfasst: 9. Juli 2006 15:48
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));
}

Verfasst: 9. Juli 2006 16:43
von Christian81
Man kann nur innerhalb von paintEvent() etwas zeichnen.
http://doc.trolltech.com/4.1/qwidget.html#paintEvent

Verfasst: 9. Juli 2006 20:28
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

Verfasst: 9. Juli 2006 22:28
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...

Verfasst: 10. Juli 2006 18:30
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;
}

Verfasst: 10. Juli 2006 20:31
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)

Verfasst: 10. Juli 2006 20:47
von slash-ex
achso :?