Qt -Timers只能用于以QThread启动的线程

时间:2015-05-19 20:43:47

标签: c++ qt unit-testing oop

我的代码是

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);

我在Here 1和Here 2之间获得了一个qwarn

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

我从QObject::startTimer: Timers can only be used with threads started with QThread了解到,当我将Qt类子类化时,子类的一个成员不是Qt层次结构的一部分。我有从QObject继承的类ExampleTest,但我仍然收到警告。如何避免这种警告?

1 个答案:

答案 0 :(得分:11)

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

在主线程中创建事件循环有两种方法:

  1. 使用QEventLoop
  2. 手动创建一个
  3. 使用QApplication(或其子类)
  4. 为您创建一个

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

      

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

         

    表现得像QTEST_MAIN(),但没有实例化QApplication   对象即可。使用此宏进行非常简单的独立非GUI测试。

    强调我的。

    所以你需要做的就是改变最后一行:

    QTEST_APPLESS_MAIN(ExampleTest);
    

    到此:

    QTEST_MAIN(ExampleTest);
    

    ......这应解决问题。