2009-04-01 16 views
6

Niedawno zacząłem uczyć się Qt.
Nie do końca zrozumiałem, jak można malować przy użyciu klasy QPainter. Powiedzmy, że chcę po prostu umieścić kilka punktów w oknie:Jak malować za pomocą QPaintera?


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(); 
} 

A potem nic nie dostałem!
Czy możesz mi powiedzieć, gdzie się mylę?

+1

i co, jeśli nie chcę reagować na paintEvent? na przykład, jeśli naciśniesz jakiś przycisk, chcę coś pomalować. jak to zrobić? – chester89

Odpowiedz

7

Myślę, że problem jest Twój inicjalizacji QPainter.

Można po prostu stworzyć QPainter jak w odpowiedzi hydroes', to będzie wyglądać to wtedy:

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++; 
     } 
    } 
} 

Może również użyć czegoś takiego, ale ja naprawdę nie polecam go (ja po prostu wolę inne rozwiązanie):

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(); 
    } 
} 

w QPainter::begin(this) i QPainter::end() połączenia są niezbędne w drugim przykładzie. W pierwszym przykładzie, można myśleć QPainter::begin(this) nazywany w konstruktorze i QPainter::end() w destructor

Dla powodu Zgaduję: Jako QPaintDevice s zwykle podwójnie buforowane w QT4, QPainter::end() może być gdzie obraz jest przesyłany do pamięci graficznej.

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

Trzeba zainicjować malarz z widgetem, który chcesz malować.
Zwykle odbywa się to za pomocą konstruktora która przyjmuje QPaintDevice ale można też zrobić to przez wywołanie begin().

Powiązane problemy