it-swarm.dev

كيو تي: كيف يمكنني التعامل مع الحدث المستخدم بالضغط على زر "X" (إغلاق)؟

أنا تطوير تطبيق باستخدام كيو تي. لا أعرف أي فتحة تتوافق مع حدث "المستخدم بالنقر فوق الزر" إغلاق "(X) لإطار النافذة" أي هذا الزر:

Close button of the window

إذا لم يكن هناك فتحة لهذا ، فهل يمكن لأي شخص أن يقترح لي طريقة أخرى يمكنني من خلالها بدء تشغيل وظيفة بعد أن يضغط المستخدم على هذا الزر.

102
The Peaceful Coder

إذا كان لديك QMainWindow ، فيمكنك تجاوز طريقة closeEvent.

#include <QCloseEvent>
void MainWindow::closeEvent (QCloseEvent *event)
{
    QMessageBox::StandardButton resBtn = QMessageBox::question( this, APP_NAME,
                                                                tr("Are you sure?\n"),
                                                                QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                                                QMessageBox::Yes);
    if (resBtn != QMessageBox::Yes) {
        event->ignore();
    } else {
        event->accept();
    }
}


إذا كنت تستخدم فئة فرعية في QDialog ، فلن يتم استدعاء closeEvent ولذا يجب عليك تجاوز reject():

void MyDialog::reject()
{
    QMessageBox::StandardButton resBtn = QMessageBox::Yes;
    if (changes) {
        resBtn = QMessageBox::question( this, APP_NAME,
                                        tr("Are you sure?\n"),
                                        QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                        QMessageBox::Yes);
    }
    if (resBtn == QMessageBox::Yes) {
        QDialog::reject();
    }
}
139
asclepix

حسنا ، فهمت ذلك. طريقة واحدة هي تجاوز QWidget::closeEvent(QCloseEvent *event) method في تعريف الفصل الدراسي الخاص بك وإضافة التعليمات البرمجية الخاصة بك في تلك الوظيفة. مثال:

class foo : public QMainWindow
{
    Q_OBJECT
private:
    void closeEvent(QCloseEvent *bar);
    // ...
};


void foo::closeEvent(QCloseEvent *bar)
{
    // Do something
    bar->accept();
}
15
The Peaceful Coder

يمكنك إرفاق فتحة ل

void aboutToQuit();

إشارة من QApplication الخاص بك. يجب رفع هذه الإشارة قبل إغلاق التطبيق.

12
Sebastian Lange

كما يمكنك إعادة تطبيق عضو محمي QWidget :: closeEvent ()

void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
    // do what you need here
    // then call parent's procedure
    QWidget::closeEvent(event);
}
7
Alexander