我最近开始学习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();
}
在那之后,我什么也没得到!
你能告诉我我错在哪里吗?
答案 0 :(得分:8)
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}
答案 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()
来完成。