自定义QML扩展插件与调用一步一脚印

环境:Win10,Qt5

可以参考help文档->QML Plugin Example&QQmlExtensionPlugin Class

  1. 建立工程

定义的c++类为MyWin,URL为默认模块名(2者必须一致,无需大小写匹配)

目录结构图

   2.C++里定义QML类型

mywin里头可以在C++里定义QML类型,可以参考help文档->Defining QML Types from C++

如下代码:

class MyWin : public QQuickItem
{
    Q_OBJECT
    Q_DISABLE_COPY(MyWin)
    Q_PROPERTY(QString str READ string )//定义QML可利用的属性
public Q_SLOTS:
    QString string(){return "custom plugin"; }//与上方的READ string对应,QML可利用的方法,因为槽函数和信号都是可以在QML中获得
public:
    MyWin(QQuickItem *parent = nullptr);
    ~MyWin();
};
myWin_plugin里头注册c++类和注册插件于Qt meta object system
 qmlRegisterType<MyWin>(uri, 1, 0, "MyWin");//MyWin是c++类显示给QML的组件名,可以随便修改

3.定义QML组件

如Win.qml代码:

import QtQuick 2.0
import QtQuick.Window 2.11

Window {
    title: "Win"
    width: 500
    height: 400
    color: "blue"
}

4.*.pro设置

uri = mywin #设定模块名

#DLLDESTDIR指定的目录必须为模块名,$$PWD指的是项目所在目录不是编译所在目录
#作用是生成插件所在目录
#This variable applies only to Windows targets.
#Specifies where to copy the
target dll. DLLDESTDIR=$$PWD/ModuleName

其实Unix平台上更简单,install直接COPY所有所需文件,windows这个DLLDESTDIR只能copy c++类的DLL文件

其他所需文件手动移动

5.设置qmldir

module mywin //模块名
Win 1.0 Win.qml  //qml文件指定
plugin MyWin//插件名

再次提醒,模块名必须与插件名一致

插件所在文件夹名必须与模块名一致

6.整理mywin目录文件
 

7.调用插件

 engine.addImportPath("../");//engine应该知道,添加路径为插件所在的上层目录

8.typeinfo plugin_name.qmltypes

需自己生成,不然无法语法高亮。可以参考HELP文档->Writing a qmltypes File

我这里好像不行,不知道是那种情况,不影响效果,就懒得手动生成了。

但可以在*.pro中设置

QML_IMPORT_PATH =../mywin   #mywin为插件所在目录
#这样可以代替typeinfo plugin_name.qmltypes来支持语法高亮
#注意只能使用系统标准路径语法,即‘../’而不是使用Qt宏来设置,如$$PWD/mywin,这样时无法高亮的
#这样对于qml组件和c++定义的qml组件都可以语法高亮了

上运行图:

一切预期一样。

猜你喜欢

转载自blog.csdn.net/qq_40032304/article/details/100856288