كيفية تنظيف QWidget / إدارة مجموعة من النوافذ بشكل صحيح؟
-
12-12-2019 - |
سؤال
لنفترض أن لدي نافذتين في طلبي، وفئتين مسؤولتين عنهما:class MainWindow: public QMainWindow
و class SomeDialog: public QWidget
.
في نافذتي الرئيسية لدي زر.عند النقر عليه، ولست بحاجة لعرض النافذة الثانية.أفعل ذلك بهذه الطريقة:
SomeDialog * dlg = new SomeDialog();
dlg.show();
الآن، يقوم المستخدم بفعل شيء ما في النافذة، ثم يقوم بإغلاقها.في هذه المرحلة أريد الحصول على بعض البيانات من تلك النافذة، وبعد ذلك، أعتقد أنني سأضطر إلى ذلك delete dlg
.ولكن كيف يمكنني اكتشاف حالة إغلاق تلك النافذة؟
أم أن هناك طريقة أخرى لعدم حدوث تسرب للذاكرة؟ربما سيكون من الأفضل إنشاء مثيل لكل نافذة عند بدء التشغيل، وبعد ذلك فقط Show()
/Hide()
هم؟
كيف يمكنني إدارة مثل هذه الحالة؟
المحلول
أعتقد أنك تبحث عن علامة نافذة Qt::WA_DeleteOnClose: http://doc.qt.io/archives/qt-4.7/qt.html#WidgetAttribute-enum
QDialog *dialog = new QDialog(parent);
dialog->setAttribute(Qt::WA_DeleteOnClose)
// set content, do whatever...
dialog->open();
// safely forget about it, it will be destroyed either when parent is gone or when the user closes it.
نصائح أخرى
ينصح باستخدامه show()
/ exec()
و hide()
بدلاً من إنشاء مربع الحوار ديناميكيًا في كل مرة تريد إظهاره.أيضا استخدام QDialog
بدلاً من QWidget
.
في مُنشئ نافذتك الرئيسية، قم بإنشائه وإخفائه
MainWindow::MainWindow()
{
// myDialog is class member. No need to delete it in the destructor
// since Qt will handle its deletion when its parent (MainWindow)
// gets destroyed.
myDialog = new SomeDialog(this);
myDialog->hide();
// connect the accepted signal with a slot that will update values in main window
// when the user presses the Ok button of the dialog
connect (myDialog, SIGNAL(accepted()), this, SLOT(myDialogAccepted()));
// remaining constructor code
}
في الفتحة المتصلة بالأزرار clicked()
الحدث ببساطة قم بإظهاره، وإذا لزم الأمر، قم بتمرير بعض البيانات إلى مربع الحوار
void myClickedSlot()
{
myDialog->setData(data);
myDialog->show();
}
void myDialogAccepted()
{
// Get values from the dialog when it closes
}
فئة فرعية من QWidget
وإعادة التنفيذ
virtual void QWidget::closeEvent ( QCloseEvent * event )
http://doc.qt.io/qt-4.8/qwidget.html#إغلاقEvent
يبدو أيضًا أن الأداة التي تريد إظهارها عبارة عن مربع حوار.لذا فكر في استخدام QDialog
أو أنها فئات فرعية. QDialog
يحتوي على إشارات مفيدة يمكنك الاتصال بها:
void accepted ()
void finished ( int result )
void rejected ()