【问题标题】:Qt -Timers can only be used with threads started with QThreadQt -Timers 只能用于以 QThread 启动的线程
【发布时间】:2015-05-19 20:43:46
【问题描述】:

我的代码是

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 类,但我仍然收到警告。如何避免这个警告?

【问题讨论】:

    标签: c++ qt unit-testing oop


    【解决方案1】:

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

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

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

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

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

    行为类似于 QTEST_MAIN(),但 不实例化 QApplication 对象。将此宏用于非常简单的独立非 GUI 测试。

    强调我的。

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

    QTEST_APPLESS_MAIN(ExampleTest);
    

    到这里:

    QTEST_MAIN(ExampleTest);
    

    ...这应该可以解决问题。

    【讨论】:

    • 然后使用make check TESTARGS="-platform offscreen" 运行QTest,并从QtCreator 为您放置的.pro 项目文件中删除QT -= gui 行。如果您使用的是 SUBDIRS 样式的单元测试项目,那么您需要将所有子项目更改为 QTEST_MAIN 以应对-platform 命令行参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2014-04-19
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多