gpt4 book ai didi

c++ - 如何在关闭的 QDialog 和新打开的 QMainWindow 之间共享对象?

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:46 25 4
gpt4 key购买 nike

我有一个为某些流程打开 QDialog 的应用程序,当它关闭时,QMainWindow 会打开。

在 QDialog 中,我创建了一些我想作为指针(或其他方式)传递给 QMainWindow 的对象。例如,我创建了一个需要从 QMainWindow 更改其状态的 SysTray 对象。什么是最好的方法?单例?

更新。
在实现 sulotion 之后,另一个问题出现了,QDialog 是否从内存中清除,这意味着调用了它的析构函数?我不认为是这样。我必须做一些对象清理,并且从未调用过析构函数

最佳答案

一种方法是以 QMainWindow 作为父级在堆上进行分配。 QObject-hierarchy将负责释放内存,您将在 QMainWindow 的生命周期内访问该对象。

如果在任何时候您确定不再需要QDialog 或共享对象,您可以调用deleteLater .

例子:

class MyDialog : public QDialog
{
Q_OBJECT

QObject* _objToShare;

public:
QObject* objToShare() const { return _objToShare; }

MyDialog(QObject* parent = 0) : QDialog(parent)
{
_objToShare = new QObject(this); // either use this as the parent
// or free by hand in the destructor
}

// ...
};

class MyWindow : public QMainWindow
{
Q_OBJECT
// ...

QObject* ptrToSharedObj; // alternatively you can hold a pointer
// to your MyDialog instance
};

你在哪里使用你的QDialog:

 MyDialog* d = new MyDialog(this);
d->exec();
ptrToSharedObj = d->objToShare();
// don't delete d explicitly, the QObject hierarchy will take care of that

更好(并且可能对内存更友好)的方法是使用共享指针实现。 Qt有多种smart pointer classes ,其中之一是 QSharedPointer。它基本上是一个线程安全的、引用计数的指针,这意味着如果您获取一个指向您的 QDialog 共享对象的指针,只要还有任何其他 ,它就不会被释放>QSharedPointer 指向它。请记住,如果您不小心,这可能会导致循环引用。

例子:

class MyDialog : public QDialog
{
Q_OBJECT

QSharedPointer<QObject> _objToShare;
// ^ don't delete in the destructor
public:

QSharedPointer<QObject> objToShare() const { return _objToShare; }

MyDialog(QObject* parent = 0) : QDialog(parent)
{
_objToShare = QSharedPointer<QObject>(new QObject);
// no parent to avoid destruction when the dialog is destructed
}

// ...
};

class MyWindow : public QMainWindow
{
Q_OBJECT
// ...

QSharedPointer<QObject> ptrToSharedObj;
};

你在哪里使用你的QDialog:

MyDialog d;
d.exec();
ptrToSharedObj = d.objToShare();

从现在开始,即使 d 超出范围(即被销毁),您仍然会有一个指向共享数据的有效指针(好吧,当然,除非您明确地做一些事情来使其无效)。

关于c++ - 如何在关闭的 QDialog 和新打开的 QMainWindow 之间共享对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6147374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com