C++/QT: 如何“运行”QAction?

3

我需要使用qt、c++和qtest(在eclipse中)自动化GUI测试。

我有一个动态创建的菜单,里面包含动态创建的QAction。我需要测试“新建选项卡”QAction(在菜单中)。下面是它的创建方式:

  m_pNewTabAction = new QAction(QIcon(":/images/add.png"), tr("&New Tab"), this);
  m_pNewTabAction->setShortcut(tr("Ctrl+N"));
  m_pNewTabAction->setStatusTip(tr("Open a new tab"));
  connect(m_pNewTabAction, SIGNAL(triggered()), this, SLOT(NewTab()));

在我的测试类中,我使用“findChildren”函数成功访问了私有的QAction对象(m_pNewTabAction),现在我不知道如何“执行”QAction(或者换句话说,“添加一个新选项卡”)

我的测试类:

    //Get the actions available for the filemenu
    QList<QAction *> fileactions = filemenu->findChildren<QAction *>();
    //Execute an action??
    fileactions.front()-> //how do I execute my QAction?
3个回答

6

我相信您正在寻找QAction::activate()

void QAction::activate(ActionEvent event)

ActionEventQAction::TriggerQAction::Hover之一。你可能想使用QAction::Trigger


我也是这么想的,但它没有起作用:我尝试了触发器和悬停,但那个函数“NewTab()”似乎没有被调用过,换句话说:没有新标签页出现。 - RandomDisplayName
1
@RandomDisplayName 那一定是另一个问题,是你没有展示的代码中出现的。Qt文档中triggered()明确说明它在调用activate(Trigger)时被调用。作为一个健全性检查,当用户触发操作时,选项卡是否出现? - Angew is no longer proud of SO
我的最大恐惧成真了。虽然代码太长无法在此展示,但还是感谢您的帮助,我会接受您的答案,因为它从技术上回答了我的问题。 - RandomDisplayName
2
@RandomDisplayName 你确定你正在触发正确的操作吗?也许你应该创建一个方法来返回你想要的 QAction 对象,而不是使用 findChildren 方法。 - thuga
我必须在那个文件菜单中测试5个QActions,并且findchildren返回5个对象,我可以从中任意选择并进行测试,但它们都不起作用,所以我猜测正如Angew提到的那样,这是另一个问题。 - RandomDisplayName

1
如果菜单项列表是动态生成的,您可能需要在任何需要使用findChild()或findChildren()查找的项目上调用setObjectName()。添加以下内容:
m_pNewTabAction->setObjectName("NewTabAction"); 

(这个字符串不需要使用tr(),因为它只是内部使用。) 然后在你的测试中,使用findChild(),然后调用QAction::trigger()

QVERIFY( filemenu );
QAction* action = filemenu->findChild<QAction*>( "NewTabAction" );
// OR you could look it up from the main window if the names are unique: 
//    QAction* action = mainWindow->findChild<QAction*>( "NewTabAction" );
QVERIFY( action );
action->trigger();

这并没有改变太多,我的意思是现在我得到了一个具有正确对象名称的QAction,但这并没有解决trigger();不起作用的问题。正如Angew之前提到的那样,它必须在代码的其他地方。 - RandomDisplayName
这应该可以工作,所以如果不行的话,你可能还有其他问题。我添加了一些可能会帮助你诊断问题的QVERIFY()调用。 - metal
+1 为了findChild的澄清,我现在用另一种方法解决了它(解决方案与我的问题没有任何共同之处,所以我不会发布它),感谢你的帮助。 - RandomDisplayName

0

从代码中运行QAction,我的代码的一部分...

void MainWindow::on_pushButtonExit_clicked()
{        
    quitAction = new QAction(this);
    connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
    quitAction->trigger();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接