2009-04-01 6 views
6

Ich habe vor kurzem angefangen, Qt zu lernen.
Ich habe nicht ganz klar, wie kann ich mit QPainter Klasse malen. Lassen Sie uns sagen, ich möchte nur ein paar Punkte in das Fenster setzen:Wie male ich mit QPainter?


class PointDrawer: public QWidget { 
    Q_OBJECT 
private: 
    QPainter p; 
public: 
    PointDrawer(QWidget* obj=0): QWidget(obj), p(this) {} 
    virtual void paintEvent(QPaintEvent*) { 
     p.setPen(QPen(Qt::black, 3)); 
     int n = 8; 
     while(...) { 
      qreal fAngle = 2 * 3.14 * i/n; 
      qreal x = 50 + cos(fAngle) * 40; 
      qreal y = 50 + sin(fAngle) * 40; 
      p.drawPoint(QPointF(x, y)); 
         i++; 
     } 
    } 
} 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 
    PointDrawer drawer; 

    drawer.resize(200, 200); 
    drawer.show(); 

    return app.exec(); 
} 

Und danach habe ich nichts!
Können Sie mir bitte sagen, wo ich falsch liege?

+1

und was, wenn ich nicht auf paintEvent reagieren möchte? zum Beispiel, wenn ich einen Knopf drücke, möchte ich etwas malen. Wie kann das gemacht werden? – chester89

Antwort

7

Ich denke, das Problem ist Ihre QPainter Initialisierung.

könnten Sie schaffen nur die QPainter wie Antwort in hydroes, würde es so dann aussehen:

class PointDrawer: public QWidget { 
    Q_OBJECT 
public: 
    PointDrawer(QWidget* obj=0): QWidget(obj) {} 
    virtual void paintEvent(QPaintEvent*) { 
     QPainter p(this) 
     p.setPen(QPen(Qt::black, 3)); 
     int n = 8; 
     while(...) { 
       qreal fAngle = 2 * 3.14 * i/n; 
       qreal x = 50 + cos(fAngle) * 40; 
       qreal y = 50 + sin(fAngle) * 40; 
       p.drawPoint(QPointF(x, y)); 
         i++; 
     } 
    } 
} 

Es ist auch so etwas wie diese verwenden könnte, aber ich wirklich nicht empfehlen (ich ziehe einfach die andere Lösung):

class PointDrawer: public QWidget { 
    Q_OBJECT 
private: 
    QPainter p; 
public: 
    PointDrawer(QWidget* obj=0): QWidget(obj) {} 
    virtual void paintEvent(QPaintEvent*) { 
     p.begin(this); 
     p.setPen(QPen(Qt::black, 3)); 
     int n = 8; 
     while(...) { 
       qreal fAngle = 2 * 3.14 * i/n; 
       qreal x = 50 + cos(fAngle) * 40; 
       qreal y = 50 + sin(fAngle) * 40; 
       p.drawPoint(QPointF(x, y)); 
         i++; 
     } 
     p.end(); 
    } 
} 

die QPainter::begin(this) und QPainter::end() Anrufe sind von wesentlicher Bedeutung im zweiten Beispiel. Im ersten Beispiel kann man sich vorstellen QPainter::begin(this) im Konstruktor und QPainter::end() im destructor

Aus dem Grunde genannt wird, vermute ich: Als QPaintDevice s sind in der Regel doppelt in QT4 gepuffert, QPainter::end() könnte sein, wo das Bild wird in den Grafikspeicher übertragen.

8
void SimpleExampleWidget::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 
    painter.setPen(Qt::blue); 
    painter.setFont(QFont("Arial", 30)); 
    painter.drawText(rect(), Qt::AlignCenter, "Qt"); 
} 

http://doc.qt.digia.com/4.4/qpainter.html

0

Sie müssen den Maler mit dem Widget Sie malen auf möchten initialisieren.
Normalerweise geschieht dies mit dem Konstruktor, der eine QPaintDevice übernimmt, aber Sie können es auch tun, indem Sie begin() aufrufen.