如何在QT/QML中创建共享库
我有4个qml文件和一个main.cpp来加载qml文件。 我是否可以为这4个qml文件创建1个dll文件。如何在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
并在不同的应用程序中使用它,如果是这样的话,如何做到这一点。请查看相关文档
<> >仅对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文件的资源文件,然后进行编译:
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等
链接: