我想创建一个基于QTcpServer
和QTcpSocket
构建的库,用于在main
函数中没有事件循环的程序中(因为Qt事件)循环阻塞,无法为所需的实时操作提供足够的时序分辨率。
我希望通过在类中创建本地事件循环来解决这个问题,但除非我先在main函数中调用app->exec()
,否则它们似乎不起作用。是否有某种方法可以创建本地事件循环并允许在线程内进行信号/插槽通信而无需应用程序级事件循环?
我已经查看了Is there a way to use Qt without QApplication::exec()?,但答案没有用,因为似乎解决方案添加了本地事件循环,但没有删除应用程序循环。
答案 0 :(得分: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();
}
}
这样即使在非Qt应用程序中也可以使用Qt共享库。