我有以下自定义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);
};
答案 0 :(得分:0)
尝试改变
OverLay *m_Overlay;
到
extern OverLay *m_Overlay;
请参阅this。
另一个Singleton解决方案:
部首:
class OverLay : public QWidget
{
public:
OverLay(const int &color, QWidget *parent = 0);
static OverLay* createInstance(const int &color, QWidget *parent = 0);
protected:
virtual void paintEvent(QPaintEvent *) override;
private:
std::vector<int> m_points;
int m_total_frames;
int m_type;
static OverLay* m_instance;
};
cpp的一部分:
OverLay *OverLay::createInstance(const int& color, QWidget *parent)
{
if(m_instance != NULL)
m_instance->deleteLater();
m_instance = new OverLay(color, parent);
return m_instance;
}
OverLay *OverLay::m_instance = NULL;
如何获取全局实例:
#include "overlay.h"
...
OverLay* overlay = OverLay::createInstance(123);