Send ShortcutOverride event when receiving a non-spontaneous key press
When a key press is received which is not spontaneous then it needs to be manually sent as a shortcut override event to ensure that any matching shortcut is triggered first. This enables emulation/playback of recorded events to still have the same effect. [ChangeLog][QtWidgets] Sending a key press event with sendEvent() now sends a ShortCutOverride event first to the widget to trigger any shortcuts set first. Task-number: QTBUG-48325 Change-Id: Iafcc2cdb1773bffe89edaeb0abc44cd5a51088e6 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
This commit is contained in:
parent
941db4e0bb
commit
7c532891e0
@ -130,6 +130,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
}
|
}
|
||||||
|
|
||||||
Q_CORE_EXPORT void qt_call_post_routines();
|
Q_CORE_EXPORT void qt_call_post_routines();
|
||||||
|
Q_GUI_EXPORT bool qt_sendShortcutOverrideEvent(QObject *o, ulong timestamp, int k, Qt::KeyboardModifiers mods, const QString &text = QString(), bool autorep = false, ushort count = 1);
|
||||||
|
|
||||||
QApplicationPrivate *QApplicationPrivate::self = 0;
|
QApplicationPrivate *QApplicationPrivate::self = 0;
|
||||||
|
|
||||||
@ -3068,8 +3069,19 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
|
|||||||
|
|
||||||
switch (e->type()) {
|
switch (e->type()) {
|
||||||
case QEvent::KeyPress: {
|
case QEvent::KeyPress: {
|
||||||
int key = static_cast<QKeyEvent*>(e)->key();
|
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(e);
|
||||||
qt_in_tab_key_event = (key == Qt::Key_Backtab
|
const int key = keyEvent->key();
|
||||||
|
// When a key press is received which is not spontaneous then it needs to
|
||||||
|
// be manually sent as a shortcut override event to ensure that any
|
||||||
|
// matching shortcut is triggered first. This enables emulation/playback
|
||||||
|
// of recorded events to still have the same effect.
|
||||||
|
if (!e->spontaneous() && receiver->isWidgetType()) {
|
||||||
|
if (qt_sendShortcutOverrideEvent(qobject_cast<QWidget *>(receiver), keyEvent->timestamp(),
|
||||||
|
key, keyEvent->modifiers(), keyEvent->text(),
|
||||||
|
keyEvent->isAutoRepeat(), keyEvent->count()))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
qt_in_tab_key_event = (key == Qt::Key_Backtab
|
||||||
|| key == Qt::Key_Tab
|
|| key == Qt::Key_Tab
|
||||||
|| key == Qt::Key_Left
|
|| key == Qt::Key_Left
|
||||||
|| key == Qt::Key_Up
|
|| key == Qt::Key_Up
|
||||||
|
@ -67,6 +67,7 @@ private slots:
|
|||||||
void keysequence(); // QTBUG-53381
|
void keysequence(); // QTBUG-53381
|
||||||
void disableShortcutsWithBlockedWidgets_data();
|
void disableShortcutsWithBlockedWidgets_data();
|
||||||
void disableShortcutsWithBlockedWidgets();
|
void disableShortcutsWithBlockedWidgets();
|
||||||
|
void shortcutFromKeyEvent(); // QTBUG-48325
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_lastEventType;
|
int m_lastEventType;
|
||||||
@ -509,5 +510,41 @@ void tst_QAction::disableShortcutsWithBlockedWidgets()
|
|||||||
QCOMPARE(spy.count(), 0);
|
QCOMPARE(spy.count(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ShortcutOverrideWidget : public QWidget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ShortcutOverrideWidget(QWidget *parent = 0) : QWidget(parent), shortcutOverrideCount(0) {}
|
||||||
|
int shortcutOverrideCount;
|
||||||
|
protected:
|
||||||
|
bool event(QEvent *e)
|
||||||
|
{
|
||||||
|
if (e->type() == QEvent::ShortcutOverride)
|
||||||
|
++shortcutOverrideCount;
|
||||||
|
return QWidget::event(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Test that a key press event sent with sendEvent() still gets handled as a possible
|
||||||
|
// ShortcutOverride event first before passing it on as a normal KeyEvent.
|
||||||
|
void tst_QAction::shortcutFromKeyEvent()
|
||||||
|
{
|
||||||
|
ShortcutOverrideWidget testWidget;
|
||||||
|
QAction action;
|
||||||
|
action.setShortcut(Qt::Key_1);
|
||||||
|
testWidget.addAction(&action);
|
||||||
|
testWidget.show();
|
||||||
|
QSignalSpy spy(&action, &QAction::triggered);
|
||||||
|
QVERIFY(spy.isValid());
|
||||||
|
QVERIFY(QTest::qWaitForWindowActive(&testWidget));
|
||||||
|
QCOMPARE(testWidget.shortcutOverrideCount, 0);
|
||||||
|
|
||||||
|
// Don't use the QTest::keyPress approach as this will take the
|
||||||
|
// shortcut route for us
|
||||||
|
QKeyEvent e(QEvent::KeyPress, Qt::Key_1, Qt::NoModifier);
|
||||||
|
QApplication::sendEvent(&testWidget, &e);
|
||||||
|
QCOMPARE(spy.count(), 1);
|
||||||
|
QCOMPARE(testWidget.shortcutOverrideCount, 1);
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_QAction)
|
QTEST_MAIN(tst_QAction)
|
||||||
#include "tst_qaction.moc"
|
#include "tst_qaction.moc"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user