0

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

ただし、その時点で QApplication オブジェクトはイベント ループに入り、ウィンドウを閉じるまで単体テストの制御を引き継ぎます。単体テストをウィンドウで引き続き実行できるようにする最善の方法は何ですか? ウィンドウ用に別のスレッドを作成する必要がありますか? 単体テストなので、できるだけシンプルに保ちたいと思います。

この質問は単体テスト フレームワークに依存しないことを意図していますが、問題が発生した場合に備えて、UnitTest++ を使用しています。

4

3 に答える 3

1

別のスレッドを作成することはできません。すべての Qt gui オブジェクトはメイン スレッドに存在する必要があるためです。シグナル/スロット メカニズムを使用して、他のスレッドからの gui オブジェクトとやり取りすることしかできません。

QTextEdit をサブクラス化し、パブリック スロット UnitTest() を実装し、次のようにテストを変更するのが最も簡単だと思います。

#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 が適切にインスタンス化され、イベント ループが実行された後、my_QTextEdit::UnitTest() へのエントリ ポイントが提供されます。または、QObject から継承した独自のクラスを実装し、パブリック スロットを作成し、 app.exec() を実行する前にそのオブジェクトを作成します (必要に応じて QTextEdit へのポインターを渡します) ; 同じ方法でスロットに接続します - あなたのニーズにより適したものは何でも。

于 2013-01-10T18:02:06.057 に答える
0

これを行うための合理的に機能するサンプルコードは、この関連する質問の回答にあります: Qt event loop and unit testing?

于 2014-04-09T03:01:20.413 に答える
0

私の自動化された Qt テストでは、 QCoreApplication::hasPendingEventsQCoreApplication::processEventsを使用することを優先して、QApplication::exec の使用を一般的にスキップします。ウィンドウを表示する)、さらに作業を行い、Qt にこれがスローした追加のイベントを処理させます。これは、小さなロジックを実行したい場合に必要なきめ細かな制御を実現するための非常に便利なアプローチです。

于 2013-01-10T20:10:21.953 に答える