2013-05-14 3 views
7

Я пытаюсь имитировать щелчок мышью на элементе QMenu из QMenuBar, например, нажав «Сохранить как» QAction, используя фреймворк QTestLib.Qt UI testing: как имитировать щелчок на элементе QMenuBar с помощью QTest?

Я трийг это под Windows XP 32 бит и Qt 5.0.2.

Любые идеи?

+0

Что бы это получилось? Просто вызовите 'QAction :: trigger()'. – cmannett85

+0

Я пытаюсь сделать приложение для автоматического тестирования для пользовательского интерфейса. –

+0

Это в основном то, что я хочу делать. Я считаю, что сложность здесь заключается в том, что QMenu не создает виджет для каждого QAction: элементы меню в значительной степени просто нарисованы непосредственно на прямоугольник меню. – fatuhoku

ответ

-1

Вы должны использовать функцию QTest::mouseClick. Он будет имитировать щелчок на любом QWidget. Я обнаружил, что попытка щелчка на QMenu, вызывающая блокирующий вызов, не будет работать с модульным тестом.

+2

Не очень хороший ответ, потому что проблема заключается в симуляции щелчка на одном элементе «Сохранить как ...» в меню. Даже если вы можете имитировать щелчок на кнопке меню «Файл», тогда отобразится меню, где-то в прямоугольнике меню находится «Сохранить как ...», но как вы имитируете клик на этом? Нет дочернего виджета для доступа (или есть?). – user405

+0

Этот ответ неверен. Потому что вопрос попросит mouseClick на QAction. Но QAction не наследует от QWidget. Таким образом, это решение полностью неверно. – LAL

5

Возможно, этот вопрос не относится к владельцу вопроса, но я полагаю, он может быть полезен другим.

В отличие от QToolBar, QMenu не имеет способа widgetForAction. Я нашел простой способ обхода этого дела. Попробуйте всплывающее меню с QTest::mouseClick, если ничего не происходит, попробуйте использовать QTest::keyClick(..., first_char_in_menu_tite, Qt::AltModifier). Чтобы имитировать действие, вы можете перемещаться с помощью Qt::Key_Down, чтобы действовать, пока не достигнете его, а затем нажмите Qt::Key_Enter. Я полагаю, следующий код поможет вам понять.

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

Я сделал аналогичный пример, но для QComboBox здесь. Спасибо, что отправил QMenu! https://gist.github.com/peteristhegreat/cbd8eaa0e565d0b82dbfb5c7fdc61c8d – phyatt

Смежные вопросы