QPainter 初始化画家并使用它

Posted

技术标签:

【中文标题】QPainter 初始化画家并使用它【英文标题】:QPainter init painter and use it 【发布时间】:2012-07-19 18:21:20 【问题描述】:

我创建了一个名为 Painter 的类,并在构造函数中创建了 QPainter p,并将 QMainWindow 作为参数传递。

所以我在 mainwindow.h 中添加了:

protected:
    void paintEvent(QPaintEvent *e);

private:
    Ui::MainWindow *ui; // Created by the QT
    Painter* p;

在我添加的 mainwindow.cpp 中

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    p=new Painter(this);

void MainWindow::paintEvent(QPaintEvent *e)

    p->render(this);

画家.h

#ifndef PAINTER_H
#define PAINTER_H
#include <QtCore>
#include <QtGui>

class Painter

private:
    QPainter* painter;
    bool init;

public:
    Painter(QMainWindow* m);
    ~Painter();

    void render(QMainWindow* m);
;

#endif // PAINTER_H

和painter.cpp

#include "painter.h"

Painter::Painter(QMainWindow* m)

    painter=new QPainter(m);
    //init=false;


void Painter::render(QMainWindow* m)

    painter->drawLine(10, 3,123, 909);

它不会画任何东西。

如果我这样做了

void Painter::render(QMainWindow* m)

    painer->begin(m);
    painter->drawLine(10, 3,123, 909);

渲染线条并在 2-3 秒后关闭

让它发挥作用的唯一方法就是去做

void Painter::render(QMainWindow* m)

    QPainter p(m);
    p.drawLine(10, 3,123, 909);

但是在每一帧初始化 p 似乎很愚蠢,它就是这样工作的。 有没有办法只初始化一次屏幕或让开始工作?

谢谢。

【问题讨论】:

【参考方案1】:

解决了

painter->begin(this->m);
painter->drawLine(10, 2, 1232, 1222);
painter->end();

这对我来说似乎很愚蠢,但总比在每一帧上都声明要好。 如果有人有更好的主意。

谢谢

【讨论】:

【参考方案2】:

您没有使用QPainter 应有的意思。本质上,QPainter 是使用

创建的
QPainter p(this);

内部绘制事件处理程序。如果您需要,您仍然可以使用指针传递画家,但如果您使用太多指向 QPainter 的指针,您可能会遇到类似的问题。

我的理解是,只有在进行绘制事件时,画家才会正确初始化,这就是为什么您在 Painter::Painter(QMainWindow* m) 中的初始化会产生非功能性的 QPainter

【讨论】:

以上是关于QPainter 初始化画家并使用它的主要内容,如果未能解决你的问题,请参考以下文章

QPainter使用整理

初始化数据库中的 QPainter#drawText 段错误

仅在关闭窗口时才更新带有计时器的 QT 画家更新

如何使用 Qpainter 在 Qt 中绘制棋盘

派生QPainterPath,QPainter性能下降很快

界面编程之QT绘图和绘图设备20180728