我正在编写的应用程序是一些类的唯一实例化,这些类必须很容易访问。为此,我使用单例。
例如,my Core被定义为:
class Core : public QObject
{
Q_OBJECT
public:
Core();
~Core();
static Core& getCore()
{
static Core mycore;
return mycore;
}
(...)
};而且它的效果非常好。然而,我试图用我的MainWindow类做同样的事情,这个类来自QMainWindow。我需要它来访问其他对象中的方法,比如geometry()
尽管内核运行得很好,但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是核心::getCore和主窗口::getUi()的宏。
发布于 2013-03-04 02:12:15
此崩溃可能是由于您的QApplication在MainWindow之前被销毁造成的。
如果您不能通过其他方式将MainWindow传递给需要它的地方的代码(例如,作为参数或通过QObjecg::parent()),您可以使用一种类似于QApplication对其instance方法(非拥有全局引用)所做的技术:
在QApplication之后,将MainWindow构造为堆栈上的一个普通局部变量。然后在0的构造函数中设置一个全局指针(可能更好的是QPointer;例如,MainWindow的静态成员),它最初初始化为0,指向this。您还可以检查它是否已在此处初始化,以强制唯一性。通过公共访问器方法(instance?)对于全局指针,您可以从任何地方访问该类,同时确保在QApplication之前销毁。
发布于 2013-03-04 03:09:40
如果您想创建单例,请尝试使用通用技术,例如,如下所述:http://www.qtcentre.org/wiki/index.php?title=Singleton_pattern
希望,在读完这篇文章后,很多问题都会消失。
对我来说,单例的实现很好,也很简单。
祝好运!
https://stackoverflow.com/questions/15186689
复制相似问题