Review Request 130162: Why QDialogButtonBox::Close could not emit closeEvent?

Leslie Zhai lesliezhai at llvm.org.cn
Mon Jun 19 07:25:02 BST 2017



> 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
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-multimedia/attachments/20170619/a088c4b2/attachment.htm>


More information about the kde-multimedia mailing list