如前所述,没有必要仅将 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。共享库
另一种方法是创建一个包含相同资源文件的共享库。例如您的插件的共享库实现了以下接口:
interface.h
#ifndef PLUGIN_INTERFACE_H
#define PLUGIN_INTERFACE_H
#include <QString>
#include <QObject>
class PluginInterface
{
public:
virtual ~PluginInterface() {}
virtual QByteArray getQML(const QString &name) = 0;
};
#define PluginInterface_iid "org.qt-project.PluginInterface"
Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid)
#endif
它的实现是:
QByteArray PluginImpl::getQML(const QString &name)
{
QFile file(":/qml/" + name);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return QByteArray();
return file.readAll();
}
现在,在您的应用程序中加载您的插件并将其资源作为字符串获取:
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);
}
}
但是请注意,当您部署应用程序时,您无论如何都必须复制所有 qml 系统文件,例如 #QTPATH/qml/QtQml、#QTPATH/qml/QtQuick.2、#QTPATH/qml/QtQuick.2等等
链接: