如何使用 QtTest 库访问 QAction?

Posted

技术标签:

【中文标题】如何使用 QtTest 库访问 QAction?【英文标题】:How to access a QAction using the QtTest lib? 【发布时间】:2016-10-28 12:55:24 【问题描述】:

我在QTableWidget (resultTable) 中有一个弹出菜单。在我的类的构造函数中,我设置了上下文菜单策略:

resultTable->setContextMenuPolicy(Qt::CustomContextMenu);
connect(resultTable, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(popUpMenuResultTable(QPoint)));

popUpMenuResultTable 函数:

void MyClass::popUpMenuResultTable(QPoint pos)

    QMenu menu;
    QAction* actionExport = menu.addAction(QIcon(":/new/prefix1/FileIcon.png"), tr("Export"));
    connect(actionExport, SIGNAL(triggered()), this, SLOT(exportResultsTable()));
    menu.popup(pos);
    menu.exec(QCursor::pos());

现在,我需要实现一个函数来使用 QtTest 库测试我的 GUI。

如何通过右键单击我的 resultTable 来产生与用户相同的结果?基本上,我需要访问actionExport (QAction) 并触发它。

例如:

我已经试过了:

QTest::mouseClick(resultTable, Qt::RightButton, Qt::NoModifier, pos, delay);

但它没有显示QMenu

我使用的是 Qt 5.3.2。

【问题讨论】:

您是否尝试过向小部件发送上下文菜单事件? IE。创建一个QContextMenuEvent 并使用QCoreApplication::sendEvent()QCoreApplication::postEvent() 发送它 不,我没试过。你能提供一个简短的例子来说明我该怎么做吗?感谢您的帮助。 【参考方案1】:

也许不完全是您所追求的,而是一种更容易测试的替代方法。

您无需手动创建菜单,而是使用小部件注册操作并使用Qt::ActionContextMenu

// e.g. in the widget's constructor
resultTable->setContextMenuPolicy(Qt::ActionsContextMenu);

QAction* actionExport = menu.addAction(QIcon(":/new/prefix1/FileIcon.png"), tr("Export"));
connect(actionExport, SIGNAL(triggered()), this, SLOT(exportResultsTable()));
resultTable->addAction(actionExport);

然后,您可以向小部件添加一个返回 resultTable->actions() 的访问器,或者只是让 actionExport 成为您班级的成员。 一旦您的测试代码可以访问该操作,它就可以简单地调用其触发器trigger() 方法。

【讨论】:

以上是关于如何使用 QtTest 库访问 QAction?的主要内容,如果未能解决你的问题,请参考以下文章

QtTest:不会生成moc文件

如何将 QMenu 中的 QAction 转换为 QWidget?

如何获得禁用的 QAction 元素的触发信号?

QAction:没有这样的文件或目录

Qt 5.4 OS X 如何在 QMenu 和 QToolBar 中使用 QAction,但仅在 QToolbar 中显示图标

如何将 QAction 添加到 QListWidget