Qt:在一个类中有一个QPainter对象实例

时间:2017-08-17 07:50:55

标签: c++ qt qpainter

我正在Qt做一个项目,并且有一个对象QPainter被声明为:

 QPainter painter(this);

这指向现在的班级。我的问题是我需要声明这个对象,以便整个类函数都可以访问它。

如果我在构造函数中声明它,那么它的作用域对其他函数无效,并且我不能在我的.cpp文件中声明所有函数,因为this变量没有任何意义。< / p>

那么如何声明我的对象以使所有函数都可以访问它?

编辑:画家代码:

void MainWindow :: paintEvent(QPaintEvent * e)
{
    QMainWindow::paintEvent(e);
        if(1)
        {
           QPainter painter(this);
           QPen paintpen(Qt::red);
           paintpen.setWidth(5);
           QPoint p1;
           p1.setX(mFirstX);
           p1.setY(mFirstY);
           painter.setPen(paintpen);
           painter.drawPoint(p1);
         }

}

鼠标事件代码:

void MainWindow :: mousePressEvent(QMouseEvent *e)
{
    mFirstX=0;
    mFirstY=0;
    mFirstClick=true;
    mpaintflag=false;

    if(e->button() == Qt::LeftButton)
            {
                //store 1st point
                if(1)
                {
                    mFirstX = e->x();
                    mFirstY = e->y();
                    mFirstClick = false;
                    mpaintflag = true;
                    qDebug() << "First image's coordinates" << mFirstX << "," << mFirstY ;
                    update();

                }

            }
}

问题:我想创建点,但我不希望它从窗口小部件(mainWindow)中消失。这里,因为每当我绘制的点在绘制下一个点时消失,就会在paintEvent方法期间创建对象。

如果我在paintEvent之外声明它,那么我会收到以下错误:

 QWidget::paintEngine: Should no longer be called  
 QPainter::begin: Paint device returned engine == 0, type: 1  
 QPainter::setPen: Painter not active

3 个答案:

答案 0 :(得分:1)

通常,全局声明QPainter对象并不是一个好主意。最好在QWidget::paintEvent(它将处于活动状态)中构造它,并且正如@Mat所说,将它(通过引用)传递给需要它的函数。

在您的特定情况下,该点会消失,因为窗口小部件被重绘,而不是因为 QPainter 被销毁。所以策略应该是创建和管理点的缓冲区。在鼠标事件中向缓冲区添加一个点,例如QWidget::mousePressEvent(也有一些管理,例如限制点数),在paint事件中 - 绘制缓冲区中的所有点。

这是一个过于简单的示例,可以根据您的具体目的轻松调整:

<强> MainWindow.h

"editor.quickSuggestions": {
        "other": true,
        "comments": true,
        "strings": true
      },

<强> MainWindow.cpp

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QPainter>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);

protected:
    void mousePressEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);

private:
    QList<QPoint> m_points;
};

#endif // MAINWINDOW_H

答案 1 :(得分:0)

属性类的用途是什么:

class MyObject : public QObject {
    Q_OBJECT

public:
    MyObject(QObject *parent = 0) : QObject(parent), painter_(this) {
        // Other things if you need them
    }

    void aFunction() {
        // You can use painter_  here !!
    }
private :
    QPainter painter_;
}

答案 2 :(得分:0)

在mainWindow.h中主窗口类的私有访问说明符中,您可以编写此行

QPainter *painterPointer

创建可在所有MainWindow插槽中访问的指针。您可以使用该painterPointer,就好像它是在任何插槽中初始化的任何画家指针一样。但是,如果要在MainWindow类之外的开发人员定义的函数或方法中使用此指针,则必须将指针作为引用(或指针指针)传递。

可能必须在MainWindow构造函数中包含与此类似的行

painterPointer = new QPainter(this);