Qt: Kullanıcının 'X' (kapat) düğmesine basması olayını nasıl ele alabilirim?


126

Qt kullanarak bir uygulama geliştiriyorum. "Pencere çerçevesinin 'X' (kapat) düğmesini tıklayan kullanıcı" olayına hangi yuvanın karşılık geldiğini bilmiyorum, yani bu düğme:

Pencerenin kapat düğmesi

Bunun için bir yuva yoksa, kullanıcı o kapat düğmesine bastıktan sonra bir işlevi başlatabileceğim başka bir yöntem önerebilir mi?

Yanıtlar:


169

Eğer varsa QMainWindowgeçersiz kılma closeEventyöntemini kullanabilirsiniz.

#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();
    }
}


Eğer a'nın alt sınıfını oluşturuyorsanız QDialog, closeEventçağrılmaz ve bu nedenle geçersiz kılmanız gerekir 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();
    }
}

Uygulamam QApplication'ın alt sınıflara ayrılmasıyla oluşturulmuşsa, yukarıdakiyle aynı şeyi nasıl yapabilirim?
prakashpun

@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));çalışmalıdır. Sebastian'ın aşağıdaki cevabına bakın.
Shiva

1
setAttribute(Qt::WA_QuitOnClose);MainWindow için de kullanmak isteyebilirsiniz .
Borzh

Alt sınıflandırma QDialog'un çağırmayacağından emin misiniz closeEvent? Bu benim için çalışıyor ve dokümantasyonu QCloseEvent söylüyor olay işleyicisi QWidget :: CloseEvent () yakın olaylarını alır ve QDialog de Widget doğru mu? Yoksa bir şekilde eski Qt sürümü (<5.x) ile mi ilişkili?
Dimitri Podborski

1
@incBrain Qt 4.8'de bile 'X' düğmesi closeEventbir QDialog'da çağırır , ancak kullanıcı klavyede Esc tuşuna basarsa QDialog arama yapılmadan kapatılır closeEvent.
asclepix

16

Ben aldım. Bunun bir yolu, sınıf tanımınızdaki yöntemi geçersiz kılmak ve kodunuzu bu işleve eklemektir. Misal:QWidget::closeEvent(QCloseEvent *event)

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


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

12

Şuraya bir SLOT ekleyebilirsiniz.

void aboutToQuit();

QApplication'ınızın sinyali. Bu sinyal, uygulama kapanmadan hemen önce yükseltilmelidir.


2
Bunu bir çeşit kullandık:connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
Sebastian Lange

3
Ancak, belgelerden alıntı yapın : "Bu durumda hiçbir kullanıcı etkileşiminin mümkün olmadığını unutmayın."
Ignitor

10

ayrıca korumalı üye QWidget :: closeEvent () 'i yeniden uygulayabilirsiniz

void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
    // do what you need here
    // then call parent's procedure
    QWidget::closeEvent(event);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.