Basic QPushButton keyboard shortcut test fails under KDE session

David Edmundson david at davidedmundson.co.uk
Sun May 8 17:41:03 UTC 2016


On Sun, May 8, 2016 at 3:10 PM, Bhushan Shah <bhush94 at gmail.com> wrote:

> On Sunday, May 8, 2016 7:26:32 PM IST, Elvis Stansvik wrote:
>
>> Hitting Ctrl+O would not print "clicked" as expected.
>>
>>
>> But then I tested logging out and into an Openbox session, and it
>> worked from there. The strange thing is that it works with Qt 4.8.7
>> under the very same KDE session where it fails with Qt 5.6.0.
>>
>> Even stranger is that neither:
>>
>>     killall kwin_x11
>>     openbox &
>>     ./test
>>
>> which I would have thought would give the same result as a logout +
>> login to Openbox, nor
>>
>>     kquitapp5 plasmashell
>>     ./test
>>
>> works, if I do that in the running KDE session. So there must be some
>> other KDE process I'm unaware of which intercepts the shortcut.
>>
>> I'm now unsure whether the problem is with Qt 5.6.0, with some
>> KDE/Plasma component, or somehow with both.
>>
>> Would appreciate a lot if someone could check and see if they can
>> reproduce.
>>
>>
> Given I debugged this earlier and can't think of any nicer solution, would
> be useful for you..
>
> This comes from
> kde:plasma-integration/src/platformtheme/kdeplatformtheme.cpp
>
> QList<QKeySequence>
> KdePlatformTheme::keyBindings(QKeySequence::StandardKey key) const
>
>
It's nothing to do with the KdePlatformTheme stuff or the standard keys in
system settings, that only affects shortcuts using QStandardKeys.

This is caused by the KAcceleratorManager from KWidgetAddons [1]

It's the bug/feature which means we see & signs all over QtCreator.

We have a class that watches for widgets and makes sure they all have a
valid accelerator. It's a clever manager with a complex in-built weighting
system.

Your push button doesn't have an accelerator so we automatically add one.
In adding an accelerator, QPushButton changes the shortcut[2]. Hence yours
doesn't work.

If you change your code to:
 button = new PushButton("Click &me (crtl+o))"
 button->setShortcut(QString("Ctrl+O"));

control+o will work
(but alt+m won't as it should)

The main code of this is kwidgetaddons/kacceleratormanager . Though I think
this is loaded from KXmlGui which starts tracking things with a
Q_COREAPP_STARTUP_FUNCTION in kcheckaccelerators - so simply linking the
library launches this tracking.

The reason this bug is newly affecting Qt apps in Qt5 but not before is
because of the QPT we're now linking against this library from every Qt
app. Whereas previously it only affected those that linked it explicitly.

One could argue that we shouldn't be messing with other widgets, but
equally I think we can argue that Qt should use two shortcuts for
setShortcut and the one from the accelerator as any translation file could
introduce a mnemonic, which would also break your shortcut in exactly the
same way.

David

[1] https://paste.kde.org/pxscewbyt
[2] https://paste.kde.org/pylds2vth
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/plasma-devel/attachments/20160508/5934ea09/attachment.html>


More information about the Plasma-devel mailing list