Qt: Bagaimana cara saya menangani kejadian pengguna menekan tombol 'X' (tutup)?
126
Saya mengembangkan aplikasi menggunakan Qt. Saya tidak tahu slot mana yang berhubungan dengan peristiwa "pengguna mengklik tombol 'X' (tutup) dari bingkai jendela" yaitu tombol ini:
Jika tidak ada slot untuk ini, adakah yang bisa menyarankan saya metode lain yang saya dapat memulai fungsi setelah pengguna menekan tombol tutup itu.
Jika aplikasi saya dibuat dengan subclassing QApplication, lalu bagaimana saya bisa mencapai hal yang sama seperti di atas?
prakashpun
@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));harus bekerja. Lihat jawaban Sebastian di bawah.
Shiva
1
Anda mungkin ingin juga menggunakan setAttribute(Qt::WA_QuitOnClose);untuk MainWindow.
Borzh
Apakah Anda yakin bahwa subclassing QDialog tidak akan memanggil closeEvent? Ini berfungsi untuk saya, dan dokumentasi QCloseEvent mengatakan bahwa pengendali peristiwa QWidget :: closeEvent () menerima peristiwa tertutup dan QDialog juga merupakan Widget, bukan? Atau apakah itu terkait dengan versi Qt yang lebih lama (<5.x) entah bagaimana?
Dimitri Podborski
1
@incBrain Bahkan di Qt 4.8 tombol 'X' memanggil closeEventdalam QDialog, tetapi jika pengguna menekan Esc pada keyboard, QDialog ditutup tanpa memanggil closeEvent.
asclepix
16
Baiklah, saya mengerti. Salah satu caranya adalah dengan mengganti metode dalam definisi kelas Anda dan menambahkan kode Anda ke dalam fungsi itu. Contoh:QWidget::closeEvent(QCloseEvent *event)
class foo :publicQMainWindow{
Q_OBJECT
private:void closeEvent(QCloseEvent*bar);// ...};void foo::closeEvent(QCloseEvent*bar){// Do something
bar->accept();}
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
harus bekerja. Lihat jawaban Sebastian di bawah.setAttribute(Qt::WA_QuitOnClose);
untuk MainWindow.closeEvent
? Ini berfungsi untuk saya, dan dokumentasi QCloseEvent mengatakan bahwa pengendali peristiwa QWidget :: closeEvent () menerima peristiwa tertutup dan QDialog juga merupakan Widget, bukan? Atau apakah itu terkait dengan versi Qt yang lebih lama (<5.x) entah bagaimana?closeEvent
dalam QDialog, tetapi jika pengguna menekan Esc pada keyboard, QDialog ditutup tanpa memanggilcloseEvent
.Baiklah, saya mengerti. Salah satu caranya adalah dengan mengganti metode dalam definisi kelas Anda dan menambahkan kode Anda ke dalam fungsi itu. Contoh:
QWidget::closeEvent
(QCloseEvent *event)
sumber
Anda dapat memasang SLOT ke
sinyal QApplication Anda. Sinyal ini harus dinaikkan tepat sebelum aplikasi ditutup.
sumber
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
Anda juga dapat menerapkan kembali anggota yang dilindungi QWidget :: closeEvent ()
sumber