[Development] QDialog vs QPushButton and it's autoDefault default

Bernhard Lindner private at bernhard-lindner.de
Tue Feb 12 20:54:21 CET 2019

Hi Volker!

Hm, ok, I see. Thanks a lot for the explanations.

Turned out the reason why the autoDefault heuristics kicks in is because the accept-role-
button is disabled by default (until the user selects an item from the table). So the
heuristic takes over a bit to early. To provide a non-auto-default I will need to set the
default button programmatically.

Still I am not satisfied. People tend to finish text input by pressing Enter, even in
dialogs. For dialogs containing a sumplementary line edit (not being the main input of the
dialog) this may also trigger some dialog action ahead of time.

Is there a good solution to help user avoiding that mistake?

I considered not to have a default button at all (neither set programmatically nor
selected automatically) but that seems difficult with that always-on heuristics.

> The default button gets pressed when the user presses Enter in a dialog, unless an
> autoDefault button has focus, in which case that button will be pressed. That’s what the
> user would expect.
> So, that your button is pressed when focus is in a QLineEdit would suggest that your
> clear button is the next autoDefault button in the focus chain (as per the documented
> behavior, and that there is no default button. Note that when using QDialogButtonBox,
> you only get a default button if one of the buttons in the box has the “Accept” role -
> otherwise you have to make one of the buttons the default button explicitly.
> So to your questions:
> 1) the behavior you are seeing seems to be as it should be, but you might have to set a
> default button for autoDefault heuristics not to take over completely and cause
> confusion.
> 2) Opt-out would make it more work to have the kind of UI the user expects (focused
> button is pressed on Enter).
> 3) QDialogButtonBox isn’t visible to the user, so a button behavior differnelty in a
> dialog just because it’s laid out in code with the help of QDialogButtonBox seems
> somewhat arbitrary.
> 4) Default values of object properties being context dependent is not that unusual
> Cheers,
> Volker

Best Regards, 
Bernhard Lindner

On 11 Feb 2019, at 22:47, Bernhard Lindner <private at bernhard-lindner.de> wrote:
> > 
> > Hi!
> > 
> > I just experienced same strange behavior of QPushButton. I want to kindly ask for some
> > explanations.
> > 
> > I wrote a QDialog derived dialog. That dialog has a standard QDialogButtonBox with
> > "Accept" and "Close" buttons. It also has various other widgets, especially a table
> > view
> > for item selection and a more complex generic/reusable filter panel (QWidget derived)
> > that
> > can be attached to any table view for complex user side filtering. That panel contains
> > various widgets, including two buttons.
> > 
> > I now have tripped painfully over a strange behavior that I could track back to the
> > fact
> > that one of those two buttons was automagically set as the dialog's default button.
> > Now,
> > whenever a user presses <Enter> to confirm QLineEdit filter input, also the mentioned
> > clear button is activated - causing a fabulous mess.
> > 
> > After some research I could explain that unexpected behavior:
> > 
> > autoDefault : bool
> >   This property holds whether the push button is an auto default button.
> >   ...
> >   This property's default is true for buttons that have a QDialog parent
> > 
> > This also means there is a workaround: I need to call "setAutoDefault(false)" on each
> > button that has the slightest chance to be ever used in a dialog. Everywhere. That is
> > doable but seems very counterintuitive to me.
> > 
> > So my questions are:
> > 1. Is this actually how the autoDefault mechanism should work?
> > 2. Why an opt-out instead of an opt-in?
> > 3. Regarding opt-out: Why not restricting the autoDefault default of true to buttons
> > with
> > QDialogButtonBox parents instead of QDialog parents?
> > 4. Anyway, is it good style to change the default value (!) of a property dynamically
> > like
> > this?> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL: <http://lists.qt-project.org/pipermail/development/attachments/20190212/2b07dc5e/attachment.sig>

More information about the Development mailing list