是否可以在不调用QApplication :: exec()的情况下创建本地事件循环?

Nic*_*aus 7 c++ qt event-loop qeventloop qapplication

我想创建一个基于其构建的库,QTcpServerQTcpSocket用于在其main函数中没有事件循环的程序中(因为Qt事件循环是阻塞的,并且不能为所需的实时操作提供足够的时序分辨率).

我希望通过在类中创建本地事件循环来解决这个问题,但除非我app->exec()首先调用main函数,否则它们似乎不起作用.有没有办法创建本地事件循环并允许在线程内进行信号/插槽通信而无需应用程序级事件循环?

我已经看过有没有办法在没有QApplication :: exec()的情况下使用Qt?但答案没有帮助,因为似乎解决方案添加了本地事件循环但不删除应用程序循环.

Nej*_*jat 7

您可以QCoreApplication在库中的新线程中创建实例.你应该检查只创建它的一个实例,那是因为每个Qt应用程序应该只包含一个QCoreApplication:

class Q_DECL_EXPORT SharedLibrary :public QObject    
{
Q_OBJECT
public:
    SharedLibrary();

private slots:

    void onStarted();

private:
    static int argc = 1;
    static char * argv[] = {"SharedLibrary", NULL};
    static QCoreApplication * app = NULL;
    static QThread * thread = NULL;
};


SharedLibrary::SharedLibrary()
{
    if (thread == NULL)
    {
        thread = new QThread();
        connect(thread, SIGNAL(started()), this, SLOT(onStarted()), Qt::DirectConnection);
        thread->start();
    }
}
SharedLibrary::onStarted()
{
   if (QCoreApplication::instance() == NULL)
   {
       app = new QCoreApplication(argc, argv);
       app->exec();
   }
}  
Run Code Online (Sandbox Code Playgroud)

这样,即使在非Qt应用程序中,您也可以使用Qt共享库.

  • @AlexWade您提到的帖子没有告诉“QCoreApplication”应该在主线程上创建。修复警告所需要做的就是“SharedLibrary”不从“QObject”继承并在构造函数中创建“QCoreApplication”实例。 (3认同)
  • 对于`QCoreApplication :: instance()`的检查,这需要额外的+1 (2认同)