簡體   English   中英

QT覆蓋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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM