![](/img/trans.png)
[英]Qt with qwt runtime error: QWidget: Must construct a QApplication before a QWidget
[英]QT Overlay QWidget Error
我有以下代碼用於自定義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);
};
嘗試改變
OverLay *m_Overlay;
至
extern OverLay *m_Overlay;
請參考這個 。
另一個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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.