Один из подходов - выделить в куче QMainWindow
в качестве родителя. QObject-иерархия позаботится об освобождении памяти, и вы получите доступ к объекту на весь срок жизни 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 имеет множество классов умных указателей , один из которых 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 выходит из области видимости (т.е. уничтожается), у вас все равно будет действительный указатель на общие данные (ну, конечно, если вы не сделаете что-то явно, чтобы аннулировать их).