我正在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
答案 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);