如何使用QPainter绘图?

9

最近我开始学习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();
}

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


1
如果我不想在paintEvent上做出反应怎么办?例如,如果我按下某个按钮,我想要绘制一些东西。这该怎么做呢? - chester89
3个回答

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


8

我认为问题出在你的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()在第二个例子中是必不可少的。在第一个例子中,可以将QPainter::begin(this)视为在构造函数中调用,而QPainter::end()则在析构函数中调用。
原因可能是,由于在QT4中QPaintDevice通常是双缓冲的,因此QPainter::end()可能是图像传输到图形内存的地方。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接