在 C 程序中使用 Qt 库

Posted

技术标签:

【中文标题】在 C 程序中使用 Qt 库【英文标题】:Using a Qt library from a C program 【发布时间】:2014-01-21 19:13:41 【问题描述】:

Qt 非常适合构建应用程序,但有一两次我想从一个用纯 C 编写的现有应用程序中显示一个漂亮的 Qt 对话框。

我想描述如何创建一个基于 Qt 的共享或静态库,该库可供不支持 Qt 的程序使用。为了缩小问题范围,假设我们调用了一个显示一些对话框或小部件的函数,并且在所有对话框关闭之前不会返回。否则,如果没有来自托管进程的一些“合作”,它就无法完成——它至少必须为 Qt 运行消息泵。

在本例中,我将使用 Windows 程序 rundll32.exe 加载并执行一个显示 Qt about 对话框的函数。

【问题讨论】:

【参考方案1】:

假设我们的 DLL 名为 MyQtBasedDll.dll,它有一个导出函数 - void MyEntryPoint()

我们将使用命令行rundll32.exe MyQtBasedDll.dll,MyEntryPoint 运行它。请注意,您需要提供 exe 和 dll 的完整路径。

为了让rundll32.exe 加载和使用程序,MyEntryPoint() 应该有一个 C 调用约定。此外,我们需要一个 QApplication 实例来执行任何 GUI 操作,而 rundll32.exe 显然不会为我们创建它。

要使用Qt Creator创建Qt库,我们可以选择File->New File or Project->Libraries->C++ Library,项目名称应为MyQtBasedDll

MyEntryPoint() 函数的代码非常简单:

extern "C"

__declspec(dllexport) void MyEntryPoint()

    if (!QApplication::instance()) 
        QApplication a(__argc, __argv);
        QMessageBox::aboutQt(0);
     else 
        QMessageBox::aboutQt(0);
    


这个函数可以被同一个exe调用多次,每次构造一个新的QApplication对象,只在函数执行期间。请注意,我们会检查现有实例,因此即使被 Qt 应用程序调用,我们的 DLL 也能正常工作。

现在你需要做的就是用你的函数替换 QMessageBox::aboutQt(0); 来做有用的事情!

【讨论】:

这是一个实际的问题还是现在是这样的博客 @Brandin "分享你的知识,问答风格" - 有一个选项,你不知道吗?此外,在the blog 中,工作人员说 - 为了清楚起见,不仅可以提出和回答您自己的问题,而且明确鼓励这样做。

以上是关于在 C 程序中使用 Qt 库的主要内容,如果未能解决你的问题,请参考以下文章

使用 qt-creator 将库项目链接到 qt 控制台/小部件项目

Linux Mint (应用软件:QT 5.X编译错误)

使用 qt 为预构建的 c 程序构建 GUI [关闭]

C++/Qt 发行版中的库链接

使用 Qt gui 绑定 C 代码 [重复]

将静态 Qt 库链接到 c 程序