首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带QMainWindow单例的单例签名

带QMainWindow单例的单例签名
EN

Stack Overflow用户
提问于 2013-03-03 22:24:46
回答 2查看 1K关注 0票数 1

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

例如,my Core被定义为:

代码语言:javascript
复制
class Core : public QObject
{
        Q_OBJECT
    public:
        Core();
        ~Core();
        static Core& getCore()
        {
            static Core mycore;
            return mycore;
        }
        (...)
};

而且它的效果非常好。然而,我试图用我的MainWindow类做同样的事情,这个类来自QMainWindow。我需要它来访问其他对象中的方法,比如geometry()

尽管内核运行得很好,但MainWindow在关闭程序时会出错。主窗口析构函数被调用并执行一次(使用qDebug()调试),但我仍然有一个SIGSEGV信号。发生什么事了呢?如何解决?

下面是MainWindow的代码

代码语言:javascript
复制
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;
}

和主代码

代码语言:javascript
复制
QApplication app(argc, argv);
try
{
    appCore().setDevice(MDMA::Kinect);
    appUi().show();
    return app.exec();
} catch(MDMA::exn e) {
    (...)
}

其中appCore和appUi是核心::getCore和主窗口::getUi()的宏。

EN

回答 2

Stack Overflow用户

发布于 2013-03-04 02:12:15

此崩溃可能是由于您的QApplicationMainWindow之前被销毁造成的。

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-03-04 03:09:40

如果您想创建单例,请尝试使用通用技术,例如,如下所述:http://www.qtcentre.org/wiki/index.php?title=Singleton_pattern

希望,在读完这篇文章后,很多问题都会消失。

对我来说,单例的实现很好,也很简单。

祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15186689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档