8

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

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

我已经看过Is there a way to use Qt without QApplication::exec()? 但答案无济于事,因为该解决方案似乎添加了一个本地事件循环,但没有删除应用程序循环。

4

1 回答 1

9

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

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

于 2015-01-06T15:20:56.650 回答