写了一个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文件要怎么弄呢? |