gpt4 book ai didi

c++ - Qt Auto-UI 测试因消息框而停止。如何模拟在消息框上输入?

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:38 24 4
gpt4 key购买 nike

我的任务是为正在开发的软件编写自动化 UI 测试。碰巧有单选按钮触发消息框,这会停止我的自动化测试,直到我手动确认它(按 ENTER)。问题是我不知道如何调用那个新召唤的消息框,然后通过 QTest::keyClick(<object>, QtKey::Key_Enter); 确认它。并让我的自动化测试继续运行。

我正在使用 QWidgets、QApplication、Q_OBJECT 和 QtTest。我将提供类似于我正在使用的代码:

void testui1(){
Form1* myform = new Form1();
myform->show();
QTest::mouseClick(myform->radioButton01, Qt::LeftButton, Qt::NoModifier, QPoint(), 100);
// Message box pops up and stops the operation until confirmed
QTest::mouseClick(myform->radioButton02, Qt::LeftButton, Qt::NoModifier, QPoint(), 100);
// again
...
}

我究竟该如何编写脚本来自动确认消息框?消息框只是一个 [OK] 类型,所以我不需要它返回我是否按了是或否。 A QTest::keyClick(<target object>, Qt::Key_Enter)方法需要知道应该向哪个对象按下回车键。我试过包括 myform进入对象,但没有用。谷歌搜索我没有找到答案。我发现以下结果无法满足我的需求

QWidgetList allToplevelWidgets = QApplication::topLevelWidgets();
foreach (QWidget *w, allToplevelWidgets) {
if (w->inherits("QMessageBox")) {
QMessageBox *mb = qobject_cast<QMessageBox *>(w);
QTest::keyClick(mb, Qt::Key_Enter);
}
}

最佳答案

问题是一旦你“点击”了你的单选按钮,导致 QMessageBox::exec 被调用,你的代码停止运行直到用户点击按钮。

您可以通过在单击单选按钮之前启动计时器来模拟用户单击按钮。

在计时器的回调函数中,您可以使用 QApplication::activeModalWidget()获取指向消息框的指针,然后对其调用 close

QTimer::singleShot(0, [=]()
{
QWidget* widget = QApplication::activeModalWidget();
if (widget)
widget->close();
});

如果你想按消息框上的特定键,你可以使用QCoreApplication::postEvent将关键事件发布到消息框

QTimer::singleShot(0, [=]()
{
int key = Qt::Key_Enter; // or whatever key you want

QWidget* widget = QApplication::activeModalWidget();
if (widget)
{
QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier);
QCoreApplication::postEvent(widget, event);
}
});

所以就这与您提供的示例代码的关系而言:

void testui1()
{
Form1* myform = new Form1();
myform->show();

QTimer::singleShot(0, [=]()
{
QWidget* widget = QApplication::activeModalWidget();
if (widget)
widget->close();
else
QFAIL("no modal widget");
});

QTest::mouseClick(myform->radioButton01, Qt::LeftButton, Qt::NoModifier, QPoint(), 100);
}

将上述所有内容组合在一起的示例应用:

#include <QApplication>
#include <QMainWindow>
#include <QHBoxLayout>
#include <QPushButton>
#include <QTimer>
#include <QMessageBox>
#include <iostream>

int main(int argc, char** argv)
{
QApplication app(argc, argv);
QMainWindow window;

QWidget widget;
window.setCentralWidget(&widget);

QHBoxLayout layout(&widget);

QPushButton btn("go");
layout.addWidget(&btn);

QObject::connect(&btn, &QPushButton::clicked, [&]()
{
QTimer::singleShot(0, [=]()
{
QWidget* widget = QApplication::activeModalWidget();
if (widget)
{
widget->close();
}
else
{
std::cout << "no active modal\n";
}
});

QMessageBox(
QMessageBox::Icon::Warning,
"Are you sure?",
"Are you sure?",
QMessageBox::Yes | QMessageBox::No,
&window).exec();
});

window.show();
return app.exec();
}

点击 Go 看起来什么都没发生,因为 QMessageBox 立即关闭。

要证明消息框已显示然后关闭,您可以将调用 QTimer::singleShot 的时间增加到一个值,如 1000。现在它会显示消息框 1 秒,然后它会被计时器关闭。

关于c++ - Qt Auto-UI 测试因消息框而停止。如何模拟在消息框上输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com