Qt定时器只能用于QThread启动的线程

Qt -Timers can only be used with threads started with QThread

本文关键字:启动 线程 QThread 用于 定时器 Qt      更新时间:2023-10-16

代码为

class ExampleTest : public QObject
{
    Q_OBJECT
public:
    ExampleTest() {}
private Q_SLOTS:
   void DoAllExampleTests();
};
void ExampleTest::DoAllExampleTests()
{
    QProcess p;
    p.start( "cmd /c wmic path Win32_usbcontrollerdevice|grep VID_1004" );
    qDebug() << "Here 1";
    QVERIFY( TRUE == p.waitForFinished() );
    qDebug() << "Here 2";
}
QTEST_APPLESS_MAIN(ExampleTest);

我在这里1和这里2之间得到一个qwarn

QObject::startTimer: Timers can only be used with threads started with QThread

我从QObject::startTimer中学到:计时器只能与QThread开始的线程使用,当我子类一个Qt类和子类的成员之一不是Qt层次结构的一部分。我有继承自QObject的ExampleTest类,但仍然得到警告。如何避免这种警告?

该警告可以使用更好的措辞——这不是QThread问题,而是事件循环问题。QThread会自动为你设置一个,但是这里你只有一个主线程。

有两种方法在主线程中创建事件循环:
  1. 用QEventLoop
  2. 手动创建一个
  3. 使用QApplication(或其子类)为您创建一个

大多数应用程序将使用选项2。但是,您正在编写单元测试。单元测试没有运行QApplication的原因是您指定了QTEST_APPLESS_MAIN。引用文档:

实现一个main()函数,该函数执行TestClass中的所有测试。

的行为类似于QTEST_MAIN(),但是不实例化QApplication对象。使用这个宏进行非常简单的独立非gui测试。

我特别强调。所以你要做的就是把最后一行改成

QTEST_APPLESS_MAIN(ExampleTest);

:

QTEST_MAIN(ExampleTest);

…这样问题就解决了。