【问题标题】:How do I paint with QPainter?我如何使用 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做出反应怎么办?例如,如果我按下某个按钮,我想画一些东西。这是怎么做到的?

标签: c++ qt


【解决方案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() 在析构函数中被调用

原因,我猜: 由于QPaintDevices 通常在 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() 来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 2016-10-26
        • 1970-01-01
        相关资源
        最近更新 更多