ฉันกำลังพัฒนาแอปพลิเคชันโดยใช้ Qt ฉันไม่ทราบว่าช่องใดที่สอดคล้องกับเหตุการณ์ของ "ผู้ใช้คลิกปุ่ม 'X' (ปิด) ของกรอบหน้าต่าง" นั่นคือปุ่มนี้:
หากไม่มีช่องนี้ใครช่วยแนะนำวิธีการอื่นให้ฉันด้วยซึ่งฉันสามารถเริ่มฟังก์ชันได้หลังจากที่ผู้ใช้กดปุ่มปิดนั้น
ฉันกำลังพัฒนาแอปพลิเคชันโดยใช้ Qt ฉันไม่ทราบว่าช่องใดที่สอดคล้องกับเหตุการณ์ของ "ผู้ใช้คลิกปุ่ม 'X' (ปิด) ของกรอบหน้าต่าง" นั่นคือปุ่มนี้:
หากไม่มีช่องนี้ใครช่วยแนะนำวิธีการอื่นให้ฉันด้วยซึ่งฉันสามารถเริ่มฟังก์ชันได้หลังจากที่ผู้ใช้กดปุ่มปิดนั้น
คำตอบ:
หากคุณมี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();
}
}
หากคุณกำลัง subclassing 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();
}
}
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
ทำงาน. ดูคำตอบของ Sebastian ด้านล่าง
setAttribute(Qt::WA_QuitOnClose);
สำหรับ MainWindow
closeEvent
? มันได้ผลสำหรับฉันและเอกสารของQCloseEventบอกว่าตัวจัดการเหตุการณ์ QWidget :: closeEvent () ได้รับเหตุการณ์ที่ใกล้ชิดและ QDialog ก็เป็นวิดเจ็ตด้วยใช่ไหม หรือเกี่ยวข้องกับ Qt เวอร์ชันเก่ากว่า (<5.x) อย่างใด
closeEvent
ใน QDialog แต่ถ้าผู้ใช้กดEscบนแป้นพิมพ์ QDialog closeEvent
ถูกปิดโดยไม่ต้องโทร
ฉันเข้าใจแล้ว วิธีหนึ่งคือการแทนที่เมธอดในนิยามคลาสของคุณและเพิ่มโค้ดของคุณลงในฟังก์ชันนั้น ตัวอย่าง:QWidget::closeEvent
(QCloseEvent *event)
class foo : public QMainWindow
{
Q_OBJECT
private:
void closeEvent(QCloseEvent *bar);
// ...
};
void foo::closeEvent(QCloseEvent *bar)
{
// Do something
bar->accept();
}
คุณสามารถแนบสล็อตเข้ากับไฟล์
void aboutToQuit();
สัญญาณของ QApplication ของคุณ สัญญาณนี้ควรขึ้นก่อนปิดแอป
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
นอกจากนี้คุณสามารถนำสมาชิกที่ได้รับการป้องกันมาใช้ใหม่ QWidget :: closeEvent ()
void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
// do what you need here
// then call parent's procedure
QWidget::closeEvent(event);
}