[英]How do I paint with QPainter?
最近开始学习Qt。
我不太清楚如何使用QPainter
class 进行绘画。 假设我只想在 window 中放置几个点:
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();
}
在那之后,我什么都没有!
你能告诉我我哪里错了吗?
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}
我认为问题在于您的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
通常在 QT4 中进行双缓冲,因此QPainter::end()
可能是将图像传输到图形 memory 的位置。
您需要使用要在其上绘制的小部件初始化画家。
通常这是使用带有QPaintDevice
的构造函数完成的,但您也可以通过调用begin()
来完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.