SIGSEGV与QMainWindow单身人士

时间:2013-03-03 14:24:46

标签: qt qt4 singleton sigsegv qmainwindow

我正在编写的应用程序作为一些必须易于访问的类的唯一实例化。为此,我使用单身人士。

例如,我的核心定义为:

class Core : public QObject
{
        Q_OBJECT
    public:
        Core();
        ~Core();
        static Core& getCore()
        {
            static Core mycore;
            return mycore;
        }
        (...)
};

它的效果非常好。但是我尝试对我的MainWindow类进行相同的操作,该类从QMainWindow进行插入。我需要它来从其他对象访问诸如geometry()之类的方法

然而,Core工作得很好,MainWindow在编写程序时会出错。主窗口析构函数被调用并执行一次(使用qDebug()调试)但我仍然有一个SIGSEGV信号。发生了什么?怎么解决?

以下是MainWindow的代码

class MainWindow : public QMainWindow
{
        Q_OBJECT
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
        static MainWindow& getUi()
        {
            static MainWindow myUi;
            return myUi;
        }
    public slots:
        void refreshImage();
    private:
        Ui::MainWindow *ui;
};
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&appCore(), SIGNAL(refreshed()), this, SLOT(refreshImage()));
}
MainWindow::~MainWindow()
{
    delete ui;
}

主要代码

QApplication app(argc, argv);
try
{
    appCore().setDevice(MDMA::Kinect);
    appUi().show();
    return app.exec();
} catch(MDMA::exn e) {
    (...)
}

其中appCore和appUi是Core :: getCore和MainWindow :: getUi()的宏

2 个答案:

答案 0 :(得分:2)

此次崩溃可能是因为QApplicationMainWindow之前销毁MainWindow

如果您无法通过其他方式将QObjecg::parent()传递给需要它的代码(例如作为参数或通过QApplication),您可以采用与MainWindow类似的技术使用它的instance方法(非拥有的全局引用):

QApplication构建为堆栈上的普通局部变量, MainWindow之后。然后在{{的构造函数中设置一个全局指针(可能更好的是QPointer;例如0的静态成员),您最初初始化为thisMainWindow 1}}。您还可以检查它是否已在此处初始化以强制执行唯一性。通过公共访问器方法(instance?)获取全局指针,您可以从任何地方访问该类,同时确保QApplication之前的销毁。

答案 1 :(得分:1)

如果你想制作单音,请尝试使用一般技术,例如,如下所述: http://www.qtcentre.org/wiki/index.php?title=Singleton_pattern

希望,阅读完所有文章后,很多问题都会消失。

至于我,单声道的实现很简单。

祝你好运!