我如何使用 QPainter 进行绘画?
Posted
技术标签:
【中文标题】我如何使用 QPainter 进行绘画?【英文标题】:How do I paint with QPainter? 【发布时间】:2009-04-01 21:53:15 【问题描述】:我最近开始学习 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();
然后,我什么也没得到!你能告诉我哪里错了吗?
【问题讨论】:
如果我不想对paintEvent做出反应怎么办?例如,如果我按下某个按钮,我想画一些东西。这是怎么做到的? 【参考方案1】:我认为问题在于您的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()
在析构函数中被调用
原因,我猜:
由于QPaintDevice
s 通常在 QT4 中双缓冲,QPainter::end()
可能是图像传输到图形内存的位置。
【讨论】:
【参考方案2】: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
【讨论】:
【参考方案3】:您需要使用要在其上绘画的小部件初始化画家。
通常这是使用带有QPaintDevice
的构造函数完成的,但您也可以通过调用begin()
来完成。
【讨论】:
以上是关于我如何使用 QPainter 进行绘画?的主要内容,如果未能解决你的问题,请参考以下文章