'QT QTest::keyclick or mouseMove seems don't work with QMenu in my case

I have a simple flow

  1. Click on QPushButton
  2. QMenu with a couple of actions appears
  3. Navigate through the QMenu using key clicks or mouse move. (Triggering actions from code isn't a way, it should be a clean GUI test).

QTest::keyClick(m_menu, Qt::Key::Key_Down); - doesn't seem to work for me.

Simple example:

#include "mainwindow.h"
#include <QTest>
MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent)
{

m_button = new QPushButton("My Button", this);
m_button->setFixedSize(100,50);


m_menu = new QMenu("&Menu");
m_menu->addAction("&test1");
m_menu->addAction("&test2");
m_menu->addAction("&test3");
m_menu->addAction("&test4");
m_menu->addAction("&test5");
m_menu->addAction("&test6");


 connect(m_button, SIGNAL (released()), this, SLOT (handleButton()));

}

void MainWindow::handleButton()
{
    m_menu->exec(m_button->mapToGlobal(QPoint(20,20)));
    QTest::qWait(2000);

    for(int i = 0 ;i<=5;i++){
      QTest::keyClick(m_menu, Qt::Key::Key_Down);
      QTest::qWait(1000);
      QTest::mouseMove(m_menu, QPoint(0,20));
      QTest::qWait(1000);

    }


}

MainWindow::~MainWindow()
{

}


Solution 1:[1]

Thanks to vahancho I found work around. QMenu.exec() is executing synchronously. So, to have an opportunity to provide some input when menu is opened we should use next template:

QTimer::singleShot(0, [menu]()
{
  //code that should be executed   
});

menu->exec();

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Bohdan Kovalenko