以下代码无法编译:
#include <functional>
template<class ...Args>
void invoke(Args&&... args)
{
}
template<class ...Args>
void bind_and_forward(Args&&... args)
{
auto binder = std::bind(&invoke<Args...>, std::forward<Args>(args)...);
binder();
}
int main()
{
int a = 1;
bind_and_forward(a, 2);
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的,原因如下:std::bind会将它的参数,当binder的operator()叫,它通过了所有绑定的参数作为左值 -即使是那些进入者bind为右值.但是invoke为原始参数进行了实例化,它无法接受binder传递它的尝试.
这个问题有什么解决方案吗?
我正在使用QTest在应用程序中创建一些自动化的GUI测试。
我可以使用以下命令从应用程序中访问小部件:
savePushButton = mainWindow->findChild<QPushButton *>("savePushButton");
Run Code Online (Sandbox Code Playgroud)
它工作正常,但是现在我必须单击QMessageBox的“确定”按钮。
我在应用程序中创建了QMessageBox,如下所示:
if( something_wrong )
{
QMessageBox::warning(new Widget(), "Title", "Something wrong!");
}
Run Code Online (Sandbox Code Playgroud)
我如何访问此QMessageBox及其按钮?
我的任务是为正在开发的软件编写自动化的 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
...
}
Run Code Online (Sandbox Code Playgroud)
我究竟如何编写脚本来自动确认消息框?消息框只是一个 [OK] 类型,所以我不需要它来返回我是否按下了 Yes 或 No。一个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);
}
}
Run Code Online (Sandbox Code Playgroud)