Windows 如何为非Qt应用程序创建Qt共享库
我已经开发了一个应用程序,其中包含Qt共享库和Qt应用程序。Qt共享库导出单个类,其中包含少量信号。为此,我使用了Q_DECL_导出/Q_DECL_导入宏。现在dll和应用程序之间的通信是通过Qt信号和插槽进行的,这需要使用QObject开发应用程序 现在我被要求将Qt共享库作为一个理想的DLL,在这个DLL中客户端应用程序不依赖于Qt框架 我看到了下面的帖子,但不确定这是否是最好的方法Windows 如何为非Qt应用程序创建Qt共享库,windows,qt,dll,shared-libraries,Windows,Qt,Dll,Shared Libraries,我已经开发了一个应用程序,其中包含Qt共享库和Qt应用程序。Qt共享库导出单个类,其中包含少量信号。为此,我使用了Q_DECL_导出/Q_DECL_导入宏。现在dll和应用程序之间的通信是通过Qt信号和插槽进行的,这需要使用QObject开发应用程序 现在我被要求将Qt共享库作为一个理想的DLL,在这个DLL中客户端应用程序不依赖于Qt框架 我看到了下面的帖子,但不确定这是否是最好的方法 有人能告诉我开发用于非Qt应用程序的Qt共享库的可能选项吗。我想您需要使用Qt库的静态链接。它要求您获取或创
有人能告诉我开发用于非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)中,该DLL是从非Qt(Delphi)应用程序加载和调用的 我遵循@Nejat的代码示例。然而,这对我来说不起作用,该线程中的任何QtGUI都被显示,但被阻止 我无法使用
QApplication::processEvents()
解决此问题,我假设与QThread冲突
解决方案不是为QApplication使用QThread,而是使用Win32
CreateThread
函数并创建一个“非qt”线程。因此,也没有必要让SharedLibrary成为QObject。听起来像是要在幕后创建一个使用Qt的API接口。根据我的经验,您必须小心不要在任何头文件中包含Qt相关的项,这些头文件将由DLL的最终用户使用。因此,您必须小心地进行所有转发声明,并将标题主要包含在.cpp files.Huytard中-谢谢您的指针。听起来是个好办法。将Qt功能限制在库中,并将应用程序的几个非Qt功能导出到接口。很抱歉,我没有领会要点。这在为非Qt应用程序创建Qt库时有何用处。它是否仍然使用Qt信号和插槽与Qt库接口?如果您想在库中使用Qt,您需要使用Qt构建它。为什么这令人惊讶?当然,它仍将使用Qt信号和插槽与Qt库接口。还有什么办法?但是您的库在没有Qt DLL的情况下也可以工作,使用库的应用程序也可以工作。谢谢Riateche。但我不希望Qt应用程序依赖于使用Qt信号和插槽。请发布您的解决方案好吗?