我开发了一个具有Qt共享库和Qt应用程序的应用程序。 Qt共享库会导出一个只有less量信号的类。 我已经使用了Q_DECL_EXPORT / Q_DECL_IMPORTmacros。 现在,dll和应用程序之间的通信是通过Qt信号和插槽来实现的,需要使用QObject来开发应用程序。
现在我被要求将Qt共享库作为理想的DLL,其中客户端应用程序不依赖于Qt框架。
我看到以下文章,但在非Qt应用程序中使用基于Qt的DLL,但不知道这是否是最好的方法。
可能有人请赐教,我可能select开发Qt共享库以用于非Qt应用程序。
我想你需要使用静态链接与Qt库。 它需要你获取或创建静态Qt库的构建,然后用它来编译你的共享库。
您可以在库中的新线程中创建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共享库。
我只是解决了同样的问题,我能够有一个QApplication完全封装在一个DLL(Qt 5.8),它是从非Qt(Delphi)应用程序加载和调用的。
我遵循@Nejat的代码示例。 然而,这并没有为我工作,该线程中的任何Qt GUI显示,但被阻止。
我无法解决这个使用QApplication::processEvents()
,我假设与QThread冲突。
解决方法是不使用QThread QApplication,而是使用Win32 CreateThread
函数并创建一个“非qt”线程。 因此,也不需要将SharedLibrary作为QObject。