1

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

例如,我的核心定义为:

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() 的宏

4

2 回答 2

2

此崩溃可能是由于您QApplicationMainWindow.

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

在. MainWindow_ _ _ 然后在 的构造函数中将初始初始化为的QApplication全局指针(可能更好QPointer;例如 的静态成员)设置为。您还可以检查它是否已在此处初始化以强制执行唯一性。通过全局指针的公共访问器方法 ( ?),您可以从任何地方访问该类,同时确保在.MainWindow0thisMainWindowinstanceQApplication

于 2013-03-03T18:12:14.740 回答
1

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

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

对我来说,单音有很好的简单实现。

祝你好运!

于 2013-03-03T19:09:40.107 回答