【发布时间】:2018-03-25 17:24:57
【问题描述】:
我有以下自定义 Qwidget 的代码
class OverLay : public QWidget
{
public:
OverLay(int color=0, QWidget *parent = 0);
protected:
virtual void paintEvent(QPaintEvent *) override;
private:
int m_type;
};
根据颜色值,我正在绘制修改paintEvent。
现在我想全局声明 OverLay *m_Overlay。因此,如果已经创建了一个实例,我将删除它并创建一个新实例。
所以在 mainwindow.h 中,我有
OverLay *m_Overlay; //After adding this line, application crashes on start
在mainwindow.cpp中,
m_Overlay = NULL;
在功能上,正在检查
if(m_overlay!=NULL){
delete m_overlay;
}
m_overlay = new OverLay(type,ui->slider->parentWidget());
m_overlay->setGeometry(ui->slider_video->geometry());
m_overlay->show();
声明本身给出错误。请问我做错了什么吗?
更新
正如@Taz742 所建议的,我添加了 Q_OBJECT 宏。现在可以在 mainwindow.h 中声明一个 Overlay 实例
OverLay *m_Overlay;
但是,如果我再声明一个实例,应用程序会在启动时再次崩溃。
OverLay *m_Overlay1,*m_Overlay2;
更新 2 这是我的 mainwindow.h。 我将 m_Overlay 声明为私有。在 mainwindow.h 中也添加了类
class OverLay : public QWidget
{
Q_OBJECT
public:
OverLay(int color=0, QWidget *parent = 0);
~OverLay() {}
protected:
virtual void paintEvent(QPaintEvent *) override;
private:
int m_type;
};
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void pushbuttonclicked();
private:
Ui::MainWindow *ui;
OverLay *m_overlay;
void draw_overlay(int type);
};
【问题讨论】:
-
在public之前尝试在你的overlay.h文件中添加Q_OBJECT宏:
-
已经尝试过.. 仍然面临同样的错误
-
尝试重新运行 qmake 并重建?
-
你在哪里声明
OverLay *m_Overlay;?请在代码中显示确切的位置。 -
@Taz742,我确实按照建议添加了 Q_OBJECT。现在我可以运行代码了。但是,如果我再创建一个实例,应用程序会再次崩溃。