我最近开始学习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(); }
在那之后,我什么都没得到!
你能告诉我我哪里错了吗?
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
我认为问题是你的QPainter
初始化.
你可以QPainter
在hydroes的回答中创建类似的东西,它看起来像这样:
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()
可能是图像传输到图形内存的地方.