2009-04-01 14 views
6

私は最近Qtを学び始めました。
QPainterクラスを使用してどのようにペイントすることができるかはっきりしませんでした。窓の中にいくつかの点を置いてみたいとしましょう: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(); 
} 

その後、私は何も持っていません!
私が間違っている場所を教えてもらえますか?

+1

paintEventイベントに反応したくない場合はどうすればよいですか?たとえば、あるボタンを押すと、何かをペイントしたいと思います。どのようにこれを行うことができますか? – chester89

答えて

7

私は問題があなたのQPainterの初期化だと思います。あなただけのhydroes'の答えのようにQPainterを作成することができ

、それは次のようになります。

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

をそれはまた、このようなものを使用することができますが、私は本当に私はちょうど好む(これはお勧めしません。他の溶液):

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

QPainter::begin(this)QPainter::end()コールは、第2実施例では必須です。私は推測している最初の例では、あなたが理由QPainter::begin(this)コンストラクタで呼び出されると、デストラクタ

QPainter::end()と考えることができ、: QPaintDeviceとしてsは通常二QT4にバッファされ、QPainter::end()はどこイメージかもしれませんグラフィックスメモリに転送されます。

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

あなたがペイントしたいウィジェットで画家を初期化する必要があります。
通常、これはQPaintDeviceのコンストラクタを使用して行われますが、begin()を呼び出すことによっても行うことができます。

関連する問題