2013-05-14 12 views
7

Ich versuche, einen Mausklick auf ein QMenu-Element aus einer QMenuBar zu simulieren, zum Beispiel auf "Speichern unter" QAction mit dem QTestLib-Framework.Qt UI-Test: Wie simuliert man einen Klick auf ein QMenuBar-Element mit QTest?

Ich triyng dies unter Windows XP 32 Bit und Qt 5.0.2.

Irgendwelche Ideen?

+0

Was würde das erreichen? Rufen Sie einfach 'QAction :: trigger()' auf. – cmannett85

+0

Ich versuche eine automatisierte Test-App für eine Benutzeroberfläche zu erstellen. –

+0

Das ist im Grunde, was ich auch tun möchte. Ich denke, die Komplikation hier ist, dass QMenu kein Widget für jede QAction erstellt: Die Menüpunkte werden so ziemlich direkt auf das Rechteck des Menüs gezeichnet. – fatuhoku

Antwort

-1

Sie sollten die QTest::mouseClick Funktion verwenden. Es simuliert den Klick auf ein beliebiges QWidget. Ich habe festgestellt, dass das Klicken auf ein QMenu, das einen blockierenden Anruf verursacht, nicht mit einem Komponententest funktioniert.

+2

Keine gute Antwort, da das Problem darin besteht, einen Klick speziell auf ein Element "Speichern unter ..." eines Menüs zu simulieren. Selbst wenn Sie einen Klick auf die Menüschaltfläche "Datei" simulieren können, wird das Menü angezeigt, irgendwo im Menü Rechteck ist der "Speichern unter ..." Teil, aber wie simulieren Sie einen Klick darauf? Es gibt kein untergeordnetes Widget, auf das zugegriffen werden kann (oder ist es?). – user405

+0

Diese Antwort ist falsch. Da die Frage nach einem Mausklick auf eine QAction fragt. Aber QAction erbt nicht von QWidget. Somit ist diese Lösung völlig falsch. – LAL

5

Wahrscheinlich ist diese Frage nicht relevant für Frage Besitzer, aber ich nehme an, es könnte für andere hilfreich sein.

Im Gegensatz zu QToolBar hat QMenu keine Methode widgetForAction. Ich habe einen einfachen Workaround für diesen Fall gefunden. Versuchen Sie Popup-Menü mit QTest::mouseClick, wenn nichts passiert, versuchen Sie QTest::keyClick(..., first_char_in_menu_tite, Qt::AltModifier) zu verwenden. Um die Ausführung einer Aktion zu simulieren, können Sie mit Qt::Key_Down bis zum Erreichen der Aktion navigieren und dann Qt::Key_Enter drücken. Ich nehme an, dass folgender Code Ihnen helfen kann, zu verstehen

QMenu *menu = getMenu(mainWindow, menuName); 
if (menu != nullptr) { 
    QTest::keyClick(mainWindow, menu->title().at(1).toLatin1(), Qt::AltModifier); 
} 


QList<QAction *> actions = menu->actions(); 
foreach (QAction *action, actions) { 
    if (action->objectName() == actionName) { 
     QTest::keyClick(menu, Qt::Key_Enter); 
     break; 
    } 
    QTest::qWait(1000); 
    QTest::keyClick(menu, Qt::Key_Down); 
} 
+0

Ich habe ein ähnliches Beispiel für QComboBox hier gemacht. Danke für die Veröffentlichung des QMenu! https://gist.github.com/peteristhegreat/cbd8eaa0e565d0b82dbfb5c7fdc61c8d – phyatt

Verwandte Themen