سؤال

لنفترض أن لدي نافذتين في طلبي، وفئتين مسؤولتين عنهما: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 ()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top