Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何为非Qt应用程序创建Qt共享库_Windows_Qt_Dll_Shared Libraries - Fatal编程技术网

Windows 如何为非Qt应用程序创建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共享库导出单个类,其中包含少量信号。为此,我使用了Q_DECL_导出/Q_DECL_导入宏。现在dll和应用程序之间的通信是通过Qt信号和插槽进行的,这需要使用QObject开发应用程序

现在我被要求将Qt共享库作为一个理想的DLL,在这个DLL中客户端应用程序不依赖于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信号和插槽。请发布您的解决方案好吗?