在 Qt 中,可以在 DLL 中创建和显示窗口。
首先,在 DLL 项目中需要添加如下的头文件和代码:
#include <QWidget>
#include <QVBoxLayout>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget* parent = nullptr)
: QWidget(parent)
{
QVBoxLayout* layout = new QVBoxLayout(this);
QLabel* label = new QLabel("Hello from DLL", this);
layout->addWidget(label);
}
};
上述代码定义了一个名为 MyWidget 的 QWidget 子类,并在构造函数中添加了一个垂直布局和一个标签。
然后,在 DLL 中需要添加一个新的导出函数,用于创建和显示窗口。该函数的实现如下:
#include "MyWidget.h"
void __declspec(dllexport) createAndShowWindow()
{
QApplication app(__argc, __argv);
MyWidget* widget = new MyWidget();
widget->show();
app.exec();
}
上述代码创建了一个 QApplication 对象,创建了一个 MyWidget 对象,并调用 show() 方法来显示窗口。最后调用 exec() 方法进入事件循环。
在主程序中,可以使用 QLibrary 类来加载 DLL 并调用导出函数。代码示例如下:
QLibrary lib("mydll.dll");
if (lib.load())
{
typedef void (*Func)();
Func createAndShowWindow = reinterpret_cast<Func>(lib.resolve("createAndShowWindow"));
if (createAndShowWindow)
{
createAndShowWindow();
}
else
{
qDebug() << "Failed to resolve function";
}
lib.unload();
}
else
{
qDebug() << "Failed to load DLL";
}
上述代码使用 QLibrary 类加载 DLL,然后通过 resolve() 方法获取导出函数的地址,并转换为函数指针类型。最后调用该函数即可显示窗口。
需要注意的是,在主程序中使用 QLibrary 加载 DLL 时,需要确保 DLL 文件的路径正确,并且 DLL 文件和主程序的架构一致(如都为 x64 或 x86)。
另外,因为在 DLL 中创建了 QApplication 对象,因此需要确保主程序中没有创建过 QApplication 对象,否则会发生错误。可以将主程序中的 QApplication 对象创建部分放置到 DLL 中的导出函数中。