Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将QT窗口用作C++;单元测试_C++_Qt_Unit Testing_Winapi_User Interface - Fatal编程技术网

C++ 将QT窗口用作C++;单元测试

C++ 将QT窗口用作C++;单元测试,c++,qt,unit-testing,winapi,user-interface,C++,Qt,Unit Testing,Winapi,User Interface,我有一些代码,它使用WinAPI通过GetWindowTextW和GetClassNameW从窗口句柄获取窗口的标题和类名。我想使用Qt为这段代码创建一个单元测试来创建一个临时窗口,对它运行我的代码,然后关闭窗口。然而,我不确定如何用一种简单的方式来做这件事。例如,我可以按如下方式创建窗口: #include "QtWidgets\qapplication.h" #include "QtWidgets\qtextedit.h" int argc = 1; char* argv[1]; QAppl

我有一些代码,它使用WinAPI通过
GetWindowTextW
GetClassNameW
从窗口句柄获取窗口的标题和类名。我想使用Qt为这段代码创建一个单元测试来创建一个临时窗口,对它运行我的代码,然后关闭窗口。然而,我不确定如何用一种简单的方式来做这件事。例如,我可以按如下方式创建窗口:

#include "QtWidgets\qapplication.h"
#include "QtWidgets\qtextedit.h"
int argc = 1;
char* argv[1];
QApplication app(argc, &argv[0]);
QTextEdit textEdit;
textEdit.show();
app.exec(;)
// Rest of my unit test here
#include "QtWidgets\qapplication.h"
#include "QtWidgets\qtextedit.h"
#include "MyTextEdit.h"
#include <QTimer>

int argc = 1;
char* argv[1];
QApplication app(argc, &argv[0]);
my_QTextEdit textEdit;
textEdit.show();
QTimer::singleShot(&my_QTextEdit,SLOT(UnitTest()),0);
app.exec();
然而,此时QApplication对象进入它的事件循环,并假设控制我的单元测试,直到我关闭窗口为止。让我的单元测试继续在窗口上运行的最佳方式是什么?我应该为窗口创建一个单独的线程吗?作为一个单元测试,我希望它尽可能简单


这个问题旨在独立于单元测试框架,但如果有问题,我使用的是UnitTest++。

您将无法创建单独的线程,因为所有Qt gui对象都必须位于主线程中,您只能使用信号/插槽机制与来自其他线程的gui对象交互

我认为最简单的方法是将QTextEdit子类化,实现public slot UnitTest(),并按如下方式修改测试:

#include "QtWidgets\qapplication.h"
#include "QtWidgets\qtextedit.h"
int argc = 1;
char* argv[1];
QApplication app(argc, &argv[0]);
QTextEdit textEdit;
textEdit.show();
app.exec(;)
// Rest of my unit test here
#include "QtWidgets\qapplication.h"
#include "QtWidgets\qtextedit.h"
#include "MyTextEdit.h"
#include <QTimer>

int argc = 1;
char* argv[1];
QApplication app(argc, &argv[0]);
my_QTextEdit textEdit;
textEdit.show();
QTimer::singleShot(&my_QTextEdit,SLOT(UnitTest()),0);
app.exec();
#包括“qtwidts\qapplication.h”
#包括“QtWidgets\qtextedit.h”
#包括“MyTextEdit.h”
#包括
int argc=1;
char*argv[1];
QApplication应用程序(argc和argv[0]);
我的文字编辑;
text编辑.show();
QTimer::singleShot(&my_qtexdit,SLOT(UnitTest()),0);
app.exec();

在QApplication正确实例化并运行事件循环后,这将为您提供my_QTextEdit::UnitTest()的入口点。或者,您可以实现从QObject继承的自己的类,创建公共插槽,在运行app.exec()之前创建该对象(如果需要,将指向QTextEdit的指针传递给它);并以同样的方式连接到插槽-无论什么更适合您的需要。

在我的自动Qt测试中,我通常跳过QApplication::exec的使用,而是使用和-这让您可以做一些准备工作,刷新事件队列(以便Qt有机会实际显示您的窗口),做更多的工作,让Qt处理由此引发的任何其他事件,等等;这是一种非常方便的方法,可以在需要执行小部分逻辑时实现所需的细粒度控制

相关问题的答案中给出了执行此操作的合理示例代码: