6

我开发了一个具有 Qt 共享库和 Qt 应用程序的应用程序。Qt 共享库导出单个类,其中的信号很少。我为此使用了 Q_DECL_EXPORT / Q_DECL_IMPORT 宏。目前 dll 和应用程序之间的通信是通过 Qt 信号和插槽进行的,这需要使用 QObject 开发应用程序。

现在我被要求将 Qt 共享库作为客户端应用程序不依赖于 Qt 框架的理想 DLL。

我看到了以下帖子,但在非 Qt 应用程序中使用基于 Qt 的 DLL,但不确定这是否是最佳方法。

有人可以告诉我开发用于非 Qt 应用程序的 Qt 共享库的可能选项。

4

3 回答 3

3

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-15T17:30:20.933 回答
1

我猜你需要使用与 Qt 库的静态链接。它要求您获取或创建静态 Qt 库构建,然后使用它来编译您的共享库。

于 2013-06-20T20:00:21.913 回答
0

我刚刚解决了同样的问题,我能够将 QApplication 完全封装在一个 DLL (Qt 5.8) 中,该 DLL 是从非 Qt (Delphi) 应用程序加载和调用的。

我遵循了@Nejat 的代码示例。但是,这对我不起作用,该线程中的任何 Qt GUI 都显示了,但被阻止了。

我无法使用它来解决这个问题,QApplication::processEvents()并且我认为与 QThread 有冲突。

解决方案不是为 QA​​pplication 使用 QThread,而是使用 Win32CreateThread函数并创建一个“非 qt”线程。因此也没有必要让 SharedLibrary 成为 QObject。

于 2017-03-12T01:02:45.560 回答