Qt: मैं 'X' (क्लोज़) बटन दबाने वाले उपयोगकर्ता की घटना को कैसे संभालूँ?


126

मैं क्यूटी का उपयोग करके एक एप्लिकेशन विकसित कर रहा हूं। मुझे नहीं पता कि कौन सा स्लॉट "विंडो फ्रेम के 'एक्स' (क्लोज्ड) बटन पर क्लिक करने वाले उपयोगकर्ता की घटना से मेल खाता है" अर्थात यह बटन:

विंडो का बंद बटन

यदि इसके लिए कोई स्लॉट नहीं है, तो क्या कोई मुझे कोई अन्य विधि सुझा सकता है जिसके द्वारा उपयोगकर्ता उस करीबी बटन को दबाने के बाद एक फ़ंक्शन शुरू कर सकता है।

जवाबों:


169

यदि आपके पास एक है 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();
    }
}

यदि मेरा आवेदन QApplication को कम करके बनाया गया है, तो मैं ऊपर जैसी ही चीज कैसे प्राप्त कर सकता हूं?
प्रकाशपुन

@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));को काम करना चाहिए। नीचे सेबेस्टियन का जवाब देखें।
शिवा

1
आप setAttribute(Qt::WA_QuitOnClose);मेनविंडो के लिए भी उपयोग करना चाह सकते हैं ।
बोरझू

क्या आप सुनिश्चित हैं कि QDialog को उपवर्ग कॉल नहीं करेगा closeEvent? यह मेरे लिए काम करता है, और QCloseEvent का प्रलेखन कहता है कि इवेंट हैंडलर QWidget :: closeEvent () क्लोज़ इवेंट्स प्राप्त करता है और QDialog भी एक विजेट सही है? या यह पुराने Qt संस्करण से संबंधित है (<5.x) किसी भी तरह?
दिमित्री पोडबोर्स्की

1
@incBrain यहां तक ​​कि Qt 4.8 में 'X' बटन closeEventएक QDialog में कॉल करता है, लेकिन यदि उपयोगकर्ता कीबोर्ड पर Esc दबाता है तो QDialog बिना कॉल किए बंद हो जाता है closeEvent
एसेक्लिपिक्स

16

खैर, मैं समझ गया। एक तरीका अपनी कक्षा की परिभाषा में विधि को ओवरराइड करना और उस फ़ंक्शन में अपना कोड जोड़ना है। उदाहरण: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

आप एक स्लॉट को संलग्न कर सकते हैं

void aboutToQuit();

आपके QApplication का संकेत। यह संकेत ऐप के बंद होने से ठीक पहले उठाया जाना चाहिए।


2
हमने इसका इस्तेमाल किया:connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
सेबेस्टियन लैंग

3
हालांकि, प्रलेखन से उद्धरण : "ध्यान दें कि इस राज्य में कोई उपयोगकर्ता बातचीत संभव नहीं है।"
प्रज्वलित करने वाला

10

भी आप संरक्षित सदस्य को फिर से लागू कर सकते हैं QWidget :: closeEvent ()

void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
    // do what you need here
    // then call parent's procedure
    QWidget::closeEvent(event);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.