【问题标题】:QT Overlay QWidget ErrorQT 覆盖 QWidget 错误
【发布时间】: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。现在我可以运行代码了。但是,如果我再创建一个实例,应用程序会再次崩溃。

标签: c++ qt


【解决方案1】:

尝试改变

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);

【讨论】:

  • 那么覆盖层不应该被破坏。它应该被隐藏起来。
  • 嗨,我只想根据颜色参数重新绘制 qwidget。我可以删除它或简单地重新绘制。我只在 mainwindow.h 的声明中遇到问题
  • 请查看更新后的问题。仅使用一个 Overlay 实例,一切都运行良好。我还可以在 mainwindow.cpp 中创建尽可能多的 Overlay 实例。但是,在 mainwindow.h 中全局声明时面临问题
  • @User123456 你试过代码了吗?如果你想创建一个全局实例,你应该使用extern 关键字或Singleton。如果您需要重新创建实例,只需在 new 之前先将其删除。
  • @Jiu,感谢您的解决方案。但是,问题出在程序的其他地方。
猜你喜欢
  • 2011-02-13
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2012-08-13
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多