C++ 如何使用QPainter进行绘画?
我最近开始学习QtC++ 如何使用QPainter进行绘画?,c++,qt,C++,Qt,我最近开始学习Qt 我不太清楚如何使用QPainterclass进行绘制。假设我只想在窗口中放置几点: class PointDrawer: public QWidget { Q_OBJECT private: QPainter p; public: PointDrawer(QWidget* obj=0): QWidget(obj), p(this) {} virtual void paintEvent(QPaintEvent*) { p.set
我不太清楚如何使用
QPainter
class进行绘制。假设我只想在窗口中放置几点:
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");
}
您需要使用要绘制的小部件初始化绘制程序。
通常这是使用构造函数来完成的,它接受
QPaintDevice
,但是您也可以通过调用begin()
来完成。我认为问题在于您的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++;
}
}
}
它也可以使用类似的东西,但我并不推荐它(我只是更喜欢其他解决方案):
在第二个示例中,QPainter::begin(this)
和QPainter::end()
调用是必不可少的。在第一个示例中,您可以考虑在构造函数中调用QPainter::begin(this)
,在析构函数中调用QPainter::end()
出于这个原因,我猜:
由于QPaintDevice
s通常在QT4中是双缓冲的,QPainter::end()
可能是图像传输到图形内存的位置。如果我不想对paintEvent做出反应,该怎么办?例如,如果我按下某个按钮,我想画一些东西。如何做到这一点?
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();
}
}