【问题标题】:How create shared library in QT/QML如何在 QT/QML 中创建共享库
【发布时间】:2016-12-05 07:05:59
【问题描述】:

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

【问题讨论】:

  • 您为什么要这样做?如果它只有 qml 文件,只需将 qml 文件复制到其他应用程序。完成。
  • @MrBlueSky 在某些情况下,您不希望将原始 QML(源代码)暴露给最终用户。

标签: qt qml qtquick2 qt-quick qtquickcontrols


【解决方案1】:

如前所述,没有必要仅将 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等等

链接:

【讨论】:

  • 部署部署工具时正确识别 Win 和 MacOS 上的依赖项,授予使用 `qmldir` 参数。如果我是你,我的世界已经添加了这一点。顺便说一句,答案很好。
【解决方案2】:

查看QML Modules 的文档

有仅 QML 模块、仅 C++ 和混合模式的选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2018-10-26
    相关资源
    最近更新 更多