如何用QPainter绘画?

时间:2009-04-01 21:53:15

标签: c++ qt

我最近开始学习Qt。
我不清楚如何使用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();
}

在那之后,我什么也没得到!
你能告诉我我错在哪里吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:7)

我认为问题在于QPainter初始化。

你可以像在水中那样创建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()来电是必不可少的。在第一个示例中,您可以考虑在构造函数中调用QPainter::begin(this)并在析构函数中调用QPainter::end()

出于这个原因,我猜测: 由于QPaintDevice通常在QT4中被双重缓冲,QPainter::end()可能是图像传输到图形存储器的位置。

答案 2 :(得分:0)

您需要使用要绘制的小部件初始化画家 通常这是使用构造函数完成的,该构造函数需要QPaintDevice,但您也可以通过调用begin()来完成。