Further improve QShortcut test
Get rid of the function-static main window, which would be destroyed after QApplication if the test is run with a subset of test row (that does not include the TestEnd state test). Make the MainWindow a class member of the test class instead, and rename it from "mainW" to "mainWindow" to avoid shadowing by "mainW" widgets in other test functions. Amends 55928821d1b119112c520af3b83dc9ed210cf5f0. Task-number: QTBUG-99630 Pick-to: 6.2 6.3 Change-Id: I83efce5b54afc3a0027a7c0e63efee6a235af585 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
7fea7dfaf3
commit
e8bf2c6eba
@ -53,6 +53,62 @@ class QMainWindow;
|
|||||||
class QTextEdit;
|
class QTextEdit;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
class TestEdit : public QTextEdit
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
TestEdit(QWidget *parent, const char *name)
|
||||||
|
: QTextEdit(parent)
|
||||||
|
{
|
||||||
|
setObjectName(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool event(QEvent *e) override
|
||||||
|
{
|
||||||
|
// Make testedit allow any Ctrl+Key as shortcut
|
||||||
|
if (e->type() == QEvent::ShortcutOverride) {
|
||||||
|
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
|
||||||
|
if (ke->modifiers() == Qt::ControlModifier
|
||||||
|
&& ke->key() > Qt::Key_Any
|
||||||
|
&& ke->key() < Qt::Key_ydiaeresis) {
|
||||||
|
ke->ignore();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If keypress not processed as normal, check for
|
||||||
|
// Ctrl+Key event, and input custom string for
|
||||||
|
// result comparison.
|
||||||
|
if (e->type() == QEvent::KeyPress) {
|
||||||
|
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
|
||||||
|
if (ke->modifiers() && ke->key() > Qt::Key_Any
|
||||||
|
&& ke->key() < Qt::Key_ydiaeresis) {
|
||||||
|
const QChar c = QLatin1Char(char(ke->key()));
|
||||||
|
if (ke->modifiers() == Qt::ControlModifier)
|
||||||
|
insertPlainText(QLatin1String("<Ctrl+") + c + QLatin1Char('>'));
|
||||||
|
else if (ke->modifiers() == Qt::AltModifier)
|
||||||
|
insertPlainText(QLatin1String("<Alt+") + c + QLatin1Char('>'));
|
||||||
|
else if (ke->modifiers() == Qt::ShiftModifier)
|
||||||
|
insertPlainText(QLatin1String("<Shift+") + c + QLatin1Char('>'));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QTextEdit::event(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MainWindow();
|
||||||
|
|
||||||
|
TestEdit *testEdit() const { return m_testEdit; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
TestEdit *m_testEdit;
|
||||||
|
};
|
||||||
|
|
||||||
class tst_QShortcut : public QObject
|
class tst_QShortcut : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -143,62 +199,7 @@ protected:
|
|||||||
void testElement();
|
void testElement();
|
||||||
|
|
||||||
Result ambigResult;
|
Result ambigResult;
|
||||||
};
|
QScopedPointer<MainWindow> mainWindow;
|
||||||
|
|
||||||
class TestEdit : public QTextEdit
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
TestEdit(QWidget *parent, const char *name)
|
|
||||||
: QTextEdit(parent)
|
|
||||||
{
|
|
||||||
setObjectName(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool event(QEvent *e) override
|
|
||||||
{
|
|
||||||
// Make testedit allow any Ctrl+Key as shortcut
|
|
||||||
if (e->type() == QEvent::ShortcutOverride) {
|
|
||||||
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
|
|
||||||
if (ke->modifiers() == Qt::ControlModifier
|
|
||||||
&& ke->key() > Qt::Key_Any
|
|
||||||
&& ke->key() < Qt::Key_ydiaeresis) {
|
|
||||||
ke->ignore();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If keypress not processed as normal, check for
|
|
||||||
// Ctrl+Key event, and input custom string for
|
|
||||||
// result comparison.
|
|
||||||
if (e->type() == QEvent::KeyPress) {
|
|
||||||
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
|
|
||||||
if (ke->modifiers() && ke->key() > Qt::Key_Any
|
|
||||||
&& ke->key() < Qt::Key_ydiaeresis) {
|
|
||||||
const QChar c = QLatin1Char(char(ke->key()));
|
|
||||||
if (ke->modifiers() == Qt::ControlModifier)
|
|
||||||
insertPlainText(QLatin1String("<Ctrl+") + c + QLatin1Char('>'));
|
|
||||||
else if (ke->modifiers() == Qt::AltModifier)
|
|
||||||
insertPlainText(QLatin1String("<Alt+") + c + QLatin1Char('>'));
|
|
||||||
else if (ke->modifiers() == Qt::ShiftModifier)
|
|
||||||
insertPlainText(QLatin1String("<Shift+") + c + QLatin1Char('>'));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return QTextEdit::event(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class MainWindow : public QMainWindow
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MainWindow();
|
|
||||||
|
|
||||||
TestEdit *testEdit() const { return m_testEdit; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
TestEdit *m_testEdit;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MainWindow::MainWindow()
|
MainWindow::MainWindow()
|
||||||
@ -1276,8 +1277,6 @@ void tst_QShortcut::testElement()
|
|||||||
if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive))
|
if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||||
QSKIP("Wayland: This fails. Figure out why.");
|
QSKIP("Wayland: This fails. Figure out why.");
|
||||||
|
|
||||||
static QScopedPointer<MainWindow> mainW;
|
|
||||||
|
|
||||||
currentResult = NoResult;
|
currentResult = NoResult;
|
||||||
QFETCH(tst_QShortcut::Action, action);
|
QFETCH(tst_QShortcut::Action, action);
|
||||||
QFETCH(tst_QShortcut::Widget, testWidget);
|
QFETCH(tst_QShortcut::Widget, testWidget);
|
||||||
@ -1294,29 +1293,29 @@ void tst_QShortcut::testElement()
|
|||||||
|
|
||||||
auto mainWindowDeleter = qScopeGuard([&]{
|
auto mainWindowDeleter = qScopeGuard([&]{
|
||||||
if (action == TestEnd)
|
if (action == TestEnd)
|
||||||
mainW.reset();
|
mainWindow.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
if (mainW.isNull())
|
if (mainWindow.isNull())
|
||||||
mainW.reset(new MainWindow);
|
mainWindow.reset(new MainWindow);
|
||||||
mainW->setWindowTitle(QTest::currentTestFunction());
|
mainWindow->setWindowTitle(QTest::currentTestFunction());
|
||||||
mainW->show();
|
mainWindow->show();
|
||||||
mainW->activateWindow();
|
mainWindow->activateWindow();
|
||||||
// Don't use QVERIFY here; the data function uses QEXPECT_FAIL,
|
// Don't use QVERIFY here; the data function uses QEXPECT_FAIL,
|
||||||
// which would result in an XPASS failure.
|
// which would result in an XPASS failure.
|
||||||
if (!QTest::qWaitForWindowActive(mainW.data()))
|
if (!QTest::qWaitForWindowActive(mainWindow.data()))
|
||||||
QVERIFY(false);
|
QVERIFY(false);
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case ClearAll:
|
case ClearAll:
|
||||||
qDeleteAll(mainW->findChildren<QShortcut *>());
|
qDeleteAll(mainWindow->findChildren<QShortcut *>());
|
||||||
break;
|
break;
|
||||||
case SetupAccel:
|
case SetupAccel:
|
||||||
setupShortcut(mainW.data(), txt, testWidget, txt.isEmpty()
|
setupShortcut(mainWindow.data(), txt, testWidget, txt.isEmpty()
|
||||||
? QKeySequence(k1, k2, k3, k4) : QKeySequence::fromString(txt));
|
? QKeySequence(k1, k2, k3, k4) : QKeySequence::fromString(txt));
|
||||||
break;
|
break;
|
||||||
case TestAccel:
|
case TestAccel:
|
||||||
sendKeyEvents(mainW.data(), k1, char16_t(c1), k2, char16_t(c2), k3, char16_t(c3), k4, char16_t(c4));
|
sendKeyEvents(mainWindow.data(), k1, char16_t(c1), k2, char16_t(c2), k3, char16_t(c3), k4, char16_t(c4));
|
||||||
QCOMPARE(currentResult, result);
|
QCOMPARE(currentResult, result);
|
||||||
break;
|
break;
|
||||||
case TestEnd:
|
case TestEnd:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user