QT5,如何从DLL中使用QML?

3
我想从一些QML构建一个DLL,以便进行部署。
modules.pro:
TARGET = modules
INCLUDEPATH += .
QT += core qml quick 
TEMPLATE = lib
RESOURCES += MyStuff.qrc

MyStuff.qrc:

<RCC>
    <qresource prefix="/">
        <file>Stuff/qmldir</file>
        <file>Stuff/random.qml</file>
    </qresource>
</RCC>

在Windows下,我使用qmake,然后使用nmake(VS2013),它会构建一个名为modules.dll的DLL文件。
我尝试按以下方式使用它:
在我的项目中创建一个名为“imports”的目录,并将其放置在其中。
   ./imports/Stuff/modules.dll

然后是 main.cpp:
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.addImportPath("imports");
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

and main.qml

import QtQuick 2.5
import QtQuick.Controls 1.4
import Stuff 1.0

ApplicationWindow {
    id: demo
    ...
}

错误,模块“Stuff”未安装。
我不知道自己在做什么,只是在摸索中前进。
有人能帮帮我吗?谢谢。

你的插件是否扩展了 QQmlExtensionPlugin./imports/Stuff 文件夹中是否包含 qmldir 文件?阅读此页面以了解QML插件创建。 - folibis
不确定这是否是一个插件。我没有扩展QQmlExtensionPlugin,发生的情况是qmake/make将.qrc文件转换为.cpp并编译它们。这里没有我的.cpp代码。现在我不确定你能否做到这一点;将QML捆绑到一个模块中。如果可以的话,如何部署而不仅仅是复制QML源树?不确定qmldir中会放什么。尝试过"module Stuff plugin Stuff"但不行。 - jkj yuio
1个回答

4

好的,我理解您想将您的*.qml文件放入外部库中。 我可以提供两种方法来实现:

  1. 创建QML插件,遵循this link。该插件可以包含资源*.qrc文件,在其中可以放置*.qml文件。

  2. 创建外部二进制资源。只需创建空的*.qrc文件,并在其中放置所有所需的资源,包括*.qml文件。然后进行编译:

$QTPATH/bin/rcc -binary/path/to/your.qrc /path/to/binary.rcc

现在,您可以在应用程序的main.cpp中包含已编译的资源文件:

QResource::registerResource("/path/to/binary.rcc");

之后,您可以使用在外部资源文件中定义的所有qml项。例如,如果您在binary.rcc中有MyItem.qml文件,则可以在本地qml文件中将其用作MyItem {}


谢谢。我尝试了插件方法,但是当我尝试加载DLL时,出现“无法为模块“Stuff”加载插件:插件验证数据不匹配...”。插件代码:https://gist.github.com/anonymous/9d44186e58fb8f733e38 项目代码:https://gist.github.com/anonymous/9b3fa453d69088eec383 - jkj yuio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接