Re: Review Request 130162: Why QDialogButtonBox::Close could not emit closeEvent?
Leslie Zhai <[email protected]> Mon, 19 Jun 2017 06:25:02 -0000
| Newsgroups | gmane.comp.kde.users.multimedia |
|---|---|
| Message-ID | <[email protected]> |
> On 六月 19, 2017, 2:20 p.m., Harald Sitter wrote: > > There are a bunch of things to note here. > > > > Firstly, please always use the new Qt 5 by-reference connection syntax when adding new connections. The old string syntax `SIGNAL()` and `SLOT()` are evaluated at runtime making them a substantial point of failure further down the road. https://wiki.qt.io/New_Signal_Slot_Syntax > > > > Secondly, with QDialogButtonBox you want to connect the box, not the individual buttons, as seen earlier in the constructor. > > > > Thirdly, your change is introducing excessive code. As Anthony said, closeEvent is called when the underlying QWidget gets closed. > > i.e. `connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::close);` without a new slot or anything would be sufficient to get exactly the same result as what you've done. That's not really the correct fix though... > > > > Lastly, reading the QDialog documentation tells us why closeEvent is not called properly. The button `Close` has a reject role in the [QDialogButtonBox](http://doc.qt.io/qt-5/qdialogbuttonbox.html#StandardButton-enum) meaning it will emit `rejected` which we connect to `QDialog::reject` which is [documented](http://doc.qt.io/qt-5/qdialog.html#reject) as "Hides the modal dialog and sets the result code to Rejected.". Simply put QDialogs practically do not get closed, they get "hidden". > > > > The way to fix this properly is to reimplemnt [QDialog::done](http://doc.qt.io/qt-5/qdialog.html#done) instead of the closeEvent. `done` is internally backing both accepted and rejected so it is always run. Change `closeEvent(QCloseEvent*)` to `done(int)` and this should work without any other changes. Hi Harald, Thanks for your hint! > The way to fix this properly is to reimplemnt QDialog::done instead of the closeEvent. done is internally backing both accepted and rejected so it is always run. Change closeEvent(QCloseEvent*) to done(int) and this should work without any other changes. I will update the patch. Regards, Leslie Zhai - Leslie ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://git.reviewboard.kde.org/r/130162/#review103343 ----------------------------------------------------------- On 六月 19, 2017, 12:18 p.m., Leslie Zhai wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://git.reviewboard.kde.org/r/130162/ > ----------------------------------------------------------- > > (Updated 六月 19, 2017, 12:18 p.m.) > > > Review request for KDE Multimedia, Albert Astals Cid and Anthony Fieroni. > > > Bugs: 381368 > http://bugs.kde.org/show_bug.cgi?id=381368 > > > Repository: k3b > > > Description > ------- > > Dear, > > As Dr. Chaptian reported "do not show again" from system configuration problems dialog is not remembered, so I simply added `slotClose` to write the entry for K3b's KConfigGroup. but I have no idea why QDialogButtonBox::Close could not emit closeEvent, not need to connect, perhaps old Qt v4.x was able to work? > > Regards, > Leslie Zhai > > > Diffs > ----- > > src/k3bsystemproblemdialog.h b45f2f80c > src/k3bsystemproblemdialog.cpp 9dfc50c1d > > Diff: https://git.reviewboard.kde.org/r/130162/diff/ > > > Testing > ------- > > > Thanks, > > Leslie Zhai > >