如何在QT/QML中创建共享库

如何在QT/QML中创建共享库,qt,qml,qtquick2,qt-quick,qtquickcontrols,Qt,Qml,Qtquick2,Qt Quick,Qtquickcontrols,我有4个qml文件和一个main.cpp来加载qml文件。 我是否可以为这4个qml文件创建1个dll文件。 并在不同的应用程序中使用它,如果是这样的话,如何做到这一点。请查看相关文档 >仅对QML模块、C++和混合模式进行选择。 < P>查看文档 PQ>只有QML模块、C++和混合模式。但当然你有权做你想做的一切,即使是那样。我至少知道两种方法: 1。创建二进制资源文件 准备包含qml文件的资源文件,然后进行编译: rcc -binary plugin.qrc -o plugin.rcc

我有4个qml文件和一个main.cpp来加载qml文件。 我是否可以为这4个qml文件创建1个dll文件。
并在不同的应用程序中使用它,如果是这样的话,如何做到这一点。

请查看相关文档


<> >仅对QML模块、C++和混合模式进行选择。

< P>查看

文档
<> PQ>只有QML模块、C++和混合模式。但当然你有权做你想做的一切,即使是那样。我至少知道两种方法:

1。创建二进制资源文件
准备包含qml文件的资源文件,然后进行编译:

rcc -binary plugin.qrc -o plugin.rcc
现在,您可以将此文件包括到应用程序中:

QResource::registerResource("plugin.rcc");
并将其用作常规qrc文件:

QResource::registerResource(qApp->applicationDirPath() + "/plugin.rcc");
QQuickView *view = new QQuickView();
view->setSource(QUrl("qrc:/qml/myfile.qml"));
这里
qml/
是资源文件中的前缀

2。共享库
另一种方法是创建包含相同资源文件的共享库。例如,插件的共享库实现以下接口:

接口.h

现在,在应用程序中加载插件并以字符串形式获取其资源:

QDir pluginsDir(qApp->applicationDirPath());
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath("plugin.dll"));
QObject *plugin = pluginLoader.instance();
if (plugin) {
    PluginInterface *pluginInstance = qobject_cast<PluginInterface *>(plugin);
    if (pluginInstance) {
        QByteArray content = pluginInstance->getQML("file1.qml");
        QQuickView *view = new QQuickView();
        QQmlComponent component(view->engine());
        component.setData(content, QUrl());
        QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
        childItem->setParentItem(view->contentItem());

        QWidget *container = QWidget::createWindowContainer(view);
        container->setFocusPolicy(Qt::TabFocus);
        ui->verticalLayout->addWidget(container);
    }
}
QDir-pluginsDir(qApp->applicationDirPath());
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(“plugin.dll”);
QObject*plugin=pluginLoader.instance();
如果(插件){
PluginInterface*pluginInstance=qobject\u cast(插件);
if(插件安装){
QByteArray content=pluginInstance->getQML(“file1.qml”);
QQuickView*视图=新的QQuickView();
QQmlComponent组件(视图->引擎());
setData(content,QUrl());
QQuickItem*childItem=qobject_cast(component.create());
childItem->setParentItem(视图->内容项());
QWidget*container=QWidget::createWindowContainer(视图);
容器->设置焦点策略(Qt::TabFocus);
ui->verticalLayout->addWidget(容器);
}
}
但请注意,在部署应用程序时,无论如何都必须复制所有qml系统文件,如#QTPATH/qml/QtQml、#QTPATH/qml/QtQuick.2、#QTPATH/qml/QtQuick.2等

链接:


如前所述,没有必要只在库中嵌入qml文件。但当然你有权做你想做的一切,即使是那样。我至少知道两种方法:

1。创建二进制资源文件
准备包含qml文件的资源文件,然后进行编译:

rcc -binary plugin.qrc -o plugin.rcc
现在,您可以将此文件包括到应用程序中:

QResource::registerResource("plugin.rcc");
并将其用作常规qrc文件:

QResource::registerResource(qApp->applicationDirPath() + "/plugin.rcc");
QQuickView *view = new QQuickView();
view->setSource(QUrl("qrc:/qml/myfile.qml"));
这里
qml/
是资源文件中的前缀

2。共享库
另一种方法是创建包含相同资源文件的共享库。例如,插件的共享库实现以下接口:

接口.h

现在,在应用程序中加载插件并以字符串形式获取其资源:

QDir pluginsDir(qApp->applicationDirPath());
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath("plugin.dll"));
QObject *plugin = pluginLoader.instance();
if (plugin) {
    PluginInterface *pluginInstance = qobject_cast<PluginInterface *>(plugin);
    if (pluginInstance) {
        QByteArray content = pluginInstance->getQML("file1.qml");
        QQuickView *view = new QQuickView();
        QQmlComponent component(view->engine());
        component.setData(content, QUrl());
        QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
        childItem->setParentItem(view->contentItem());

        QWidget *container = QWidget::createWindowContainer(view);
        container->setFocusPolicy(Qt::TabFocus);
        ui->verticalLayout->addWidget(container);
    }
}
QDir-pluginsDir(qApp->applicationDirPath());
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(“plugin.dll”);
QObject*plugin=pluginLoader.instance();
如果(插件){
PluginInterface*pluginInstance=qobject\u cast(插件);
if(插件安装){
QByteArray content=pluginInstance->getQML(“file1.qml”);
QQuickView*视图=新的QQuickView();
QQmlComponent组件(视图->引擎());
setData(content,QUrl());
QQuickItem*childItem=qobject_cast(component.create());
childItem->setParentItem(视图->内容项());
QWidget*container=QWidget::createWindowContainer(视图);
容器->设置焦点策略(Qt::TabFocus);
ui->verticalLayout->addWidget(容器);
}
}
但请注意,在部署应用程序时,无论如何都必须复制所有qml系统文件,如#QTPATH/qml/QtQml、#QTPATH/qml/QtQuick.2、#QTPATH/qml/QtQuick.2等

链接:


您为什么要这样做?如果只有qml文件,只需将qml文件复制到其他应用程序。完成。@在某些情况下,您不希望原始QML(源代码)暴露给最终用户。为什么要这样做?如果只有qml文件,只需将qml文件复制到其他应用程序。完成。@MrBlueSky在某些情况下,您不希望原始QML(源代码)暴露给最终用户。在部署部署工具时,正确识别Win和MacOS上的依赖项,并使用'qmldir'参数。如果我是你,我会加上这句话。顺便说一句,答案不错。在部署部署工具时,正确识别Win和MacOS上的依赖项,并使用'qmldir'参数。如果我是你,我会加上这句话。顺便说一句,回答很好。