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

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

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

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

【问题讨论】:

    标签: c++ c qt dll


    【解决方案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 中,工作人员说 - 为了清楚起见,不仅可以提出和回答您自己的问题,而且明确鼓励这样做。
    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多