找回密码
 立即注册
收起左侧

自定义组件的加载问题

4
回复
2060
查看
[复制链接]
累计签到:256 天
连续签到:1 天
来源: 2022-5-19 17:59:36 显示全部楼层 |阅读模式
30Qter豆
写了一个demo1.用于生成一个qml的自定义组件,定位是c++部分的逻辑和属性以及相关的信号。

主要demo:
#include "myitem.h"
#include "classa.h"
#include <qqml.h>

void Demo1Plugin::registerTypes(const char *uri)
{
    // @uri demo1
    //在加载的时候会进行注册
    qmlRegisterType<MyItem>(uri, 1, 0, "MyItem");
    qmlRegisterType<classA>(uri, 1, 0, "classA");
}

class MyItem : public QQuickItem
{
    Q_OBJECT
    Q_DISABLE_COPY(MyItem)

    int m_param1;
    QString m_param2;
public:
    explicit MyItem(QQuickItem *parent = nullptr);
    ~MyItem() override;

    Q_PROPERTY(int param1 READ getParam1 WRITE setParam1 NOTIFY param1Changed);
    Q_PROPERTY(QString param2 READ getParam2 WRITE setParam2 NOTIFY param2Changed);

    int getParam1() const
    {
        return m_param1;
    }
    QString getParam2() const
    {
        return m_param2;
    }

public slots:
。。。

}

qmldir文件:
module demo1
plugin demo1


然后demo2是qml的一个工程,用于实现页面的显示,并且将demo1编译生成的demo1.dll和qmldir文件进行加载,然后使用这个组件。
我尝试了在.pro中添加
QML_IMPORT_PATH = $$PWD/plugin

或者是在main.cpp中添加
QString importPath = "C:/workFiles/demo/demo2/plugin";
    engine.addImportPath(importPath);
    for(QString path : engine.importPathList()){
        qDebug() << "import path_" +  path;
    }

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);



    engine.load(url);


在main.qml中,也可以import demo1 1.0 是正常的
但是运行时会报错
qrc:/main.qml:5:1: module "demo1" is not installed

请帮忙看一下这种加载方式正确吗。或者是哪里出了问题呢

我知道很多是将c++文件和qml放到一个工程进行注册使用,那如果出现需要引用生成的dll文件要怎么弄呢?

最佳答案

查看完整内容

来了老铁,顶顶顶顶一下
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2022-5-19 17:59:37 显示全部楼层
来了老铁,顶顶顶顶一下

点评

老铁我怎么觉得对你好熟悉的样子 哈哈哈 失踪人口回归?  详情 回复 发表于 2022-5-31 10:25
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2022-5-23 11:29:39 显示全部楼层
通过查文档找到问题了。
在主程序中使用QQmlApplicationEngine 的addImportPath接口时,所给参数是需要导入的插件的路径。
注:每一个插件应该是一个文件夹的形式存在,里面储存了插件的dll和qmldir文件。所以参数=包括插件文件夹的文件夹路径(例如需要使用demo/demo2/demo1这个插件,那么给demo/demo2这个路径即可
来个小伙伴回复下 问题结束了 哈哈
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2022-5-31 10:25:24 显示全部楼层
cai901022 发表于 2022-5-27 17:22
来了老铁,顶顶顶顶一下

老铁我怎么觉得对你好熟悉的样子 哈哈哈 失踪人口回归?

点评

是的,失踪好久了,终于找回密码回来了  详情 回复 发表于 2022-6-8 16:02
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2022-6-8 16:02:24 显示全部楼层
z55716368 发表于 2022-5-31 10:25
老铁我怎么觉得对你好熟悉的样子 哈哈哈 失踪人口回归?

是的,失踪好久了,终于找回密码回来了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了