2016-12-05 51 views
2

qmlファイルを4つ、main.cppを1つ含んでいます。 これら4つのqmlファイルに対して1つのdllファイルを作成することは可能ですか? それを行う方法が異なる場合は、別のアプリケーションで使用してください。QT/QMLで共有ライブラリを作成する方法

+0

なぜあなたはこれをしたいですか?唯一のqmlファイルの場合は、qmlファイルを他のアプリケーションにコピーしてください。完了しました。 – MrBlueSky

答えて

2

はQML-モジュールのみのオプション、C++のみと混合モードがありますQML Modules

のドキュメントを見てください。

3

すでに述べたように、qmlファイルをライブラリに埋め込む必要はありません。しかしもちろん、あなたはあなたが望むすべてをやる権利があります。
はQMLファイルを含むリソースファイルを用意し、それをコンパイルし

1.バイナリリソースファイルを作成します:今、あなたはあなたにこのファイルを含めることができ

rcc -binary plugin.qrc -o plugin.rcc 

私はそれを行うには、少なくとも2つの方法を知っていますアプリケーション:

QResource::registerResource("plugin.rcc"); 

と通常のQRCファイルとしてそれを使用する:

QResource::registerResource(qApp->applicationDirPath() + "/plugin.rcc"); 
QQuickView *view = new QQuickView(); 
view->setSource(QUrl("qrc:/qml/myfile.qml")); 

qml/は、リソースファイル内の接頭辞です。

2.共有ライブラリ
もう1つの方法は、同じリソースファイルを含む共有ライブラリを作成することです。インタフェース以下プラグインの共有ライブラリの実装例:

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); 
    } 
} 

アプリケーションをデプロイするときは、#QTPATH/qml/QtQml、#QTPATH/qml/QtQuick.2、#QTPATH/qml/QtQuick.2などのすべてのqmlシステムファイルをコピーする必要があります。

リンク:

+0

デプロイメントツールをWindowsとMacOSの両方で正しく認識された依存関係にデプロイするときは、 'qmldir'パラメータが使用されます。もし私があなたなら私は世界に追加しました。素晴らしい答えです。 – BaCaRoZzo

関連する問題