2009-04-01 48 views
6

Gần đây tôi đã bắt đầu học Qt.
Tôi không hiểu rõ làm thế nào tôi có thể vẽ bằng cách sử dụng lớp QPainter. Giả sử tôi muốn chỉ để đặt một vài điểm trong cửa sổ:Làm cách nào để vẽ bằng 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(); 
} 

Và sau đó, tôi không có gì!
Bạn có thể cho tôi biết tôi đã sai ở đâu không?

+1

và điều gì sẽ xảy ra nếu tôi không muốn phản ứng trên paintEvent? ví dụ, nếu tôi nhấn một số nút, tôi muốn vẽ một cái gì đó. Điều này có thể giải quyết như thế nào? – chester89

Trả lời

7

Tôi nghĩ rằng sự cố là khởi tạo QPainter của bạn.

Bạn chỉ có thể tạo ra các QPainter như trong câu trả lời hydroes', nó sẽ trông như thế này thì:

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

Nó cũng có thể sử dụng một cái gì đó như thế này, nhưng tôi không thực sự khuyên bạn nên nó (tôi chỉ thích các giải pháp khác):

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

các QPainter::begin(this)QPainter::end() cuộc gọi là rất cần thiết trong ví dụ thứ hai. Trong ví dụ đầu tiên, bạn có thể nghĩ đến QPainter::begin(this) được gọi trong các nhà xây dựng và QPainter::end() trong destructor

Cũng vì lý do, tôi đoán: Như QPaintDevice s thường đôi đệm trong Qt4, QPainter::end() có thể là nơi hình ảnh được chuyển vào bộ nhớ đồ họa.

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

Bạn cần phải khởi tạo các họa sĩ với các widget mà bạn muốn vẽ trên.
Thông thường việc này được thực hiện bằng cách sử dụng hàm tạo có số QPaintDevice nhưng bạn cũng có thể thực hiện điều đó bằng cách gọi begin().

Các vấn đề liên quan