2016-12-05 19 views
2

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

+0

你为什么要这样做?如果它只有qml文件,只需将qml文件复制到其他应用程序。完成。 – MrBlueSky

回答

2

看一看的文档QML Modules

存在用于QML-只有模块的选项,C++之用,混合模式。

3

如前所述,不需要仅将qml文件嵌入库中。但是,当然,你有权做到你想做的一切,即使是那样。我知道至少有2种方式来做到这一点:

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等

链接:

+0

在Win和MacOS上部署部署工具正确识别的依赖项时,授予使用'qmldir'参数的权限。如果我是你,我的世界已经补充说。顺便说一句好的答案。 – BaCaRoZzo