我正在编写的应用程序作为一些必须易于访问的类的唯一实例化。为此,我使用单身人士。
例如,我的核心定义为:
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()的宏
答案 0 :(得分:2)
此次崩溃可能是因为QApplication
在MainWindow
之前销毁MainWindow
。
如果您无法通过其他方式将QObjecg::parent()
传递给需要它的代码(例如作为参数或通过QApplication
),您可以采用与MainWindow
类似的技术使用它的instance
方法(非拥有的全局引用):
将QApplication
构建为堆栈上的普通局部变量, MainWindow
之后。然后在{{的构造函数中设置一个全局指针(可能更好的是QPointer
;例如0
的静态成员),您最初初始化为this
,MainWindow
1}}。您还可以检查它是否已在此处初始化以强制执行唯一性。通过公共访问器方法(instance
?)获取全局指针,您可以从任何地方访问该类,同时确保QApplication
之前的销毁。
答案 1 :(得分:1)
如果你想制作单音,请尝试使用一般技术,例如,如下所述: http://www.qtcentre.org/wiki/index.php?title=Singleton_pattern
希望,阅读完所有文章后,很多问题都会消失。
至于我,单声道的实现很简单。
祝你好运!