QML自定义组件实现(扩展插件)

1背景

QML 的组件(控件)已经有很多了,在安装目录的qml下。例如:
C:\Qt\Qt5.12.0\5.12.0\mingw73_64\qml或者
C:\Qt\Qt5.12.0\5.12.0\msvc2015_64\qml
最常用的是:QtQuick和QtQuick2.那么,如何自定义新增的库呢?
比如想自己制作一套个性风格的按钮、输入框、进度条、下拉框等?
在这里插入图片描述

2 步骤

1 新建 Qt Quick 2 Extension plugin插件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 添加qml文件作为新控件,文件名要大写开头文件名就是控件名。

没有什么特别,普通的qml即可。如下
HikButton.qml

import QtQuick 2.12
import QtQuick.Controls 2.12
Rectangle {
    id: root
    property alias textItem: t      //导出Text实例,方便外部直接修改
    property alias text: t.text     //导出文本
    property alias textColor: t.color   //导出文本颜色
    property alias containsMouse: area.containsMouse    //导出鼠标悬浮
    property alias containsPress: area.containsPress    //导出鼠标按下
    signal clicked();               //自定义点击信号
    color: "transparent"
    Text {
        id: t
        //默认坐标居中
        anchors.centerIn: parent
        //默认文字对齐方式为水平和垂直居中
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignHCenter
        //默认宽度为parent的宽度,这样字太长超出范围时自动显示省略号
        width: parent.width
        elide: Text.ElideRight
    }

    MouseArea {
        id: area
        anchors.fill: parent;
        hoverEnabled: parent.enabled;
        onClicked: root.clicked();  //点击时触发自定义点击信号
        cursorShape: Qt.PointingHandCursor  //悬浮或点击时的鼠标样式
    }
}

4 添加C++类作为新控件类型(用的很少)

1 要继承QObject或者子类
2 要有Q_OBJECT宏
3 属性要Q_PROPERTY 函数要Q_INVOKABLE
4 重写 registerTypes 函数如下

void IscQMLPlugin::registerTypes(const char *uri)
{
    // @uri IscQML
    qmlRegisterType<IscQML>(uri, 1, 0, "MyClass");
    qmlRegisterType<visitor>(uri, 1, 0, "Visitor");
}

5 修改qmldir

内容如下

module IscQML
plugin IscQML

MyRect 1.0 MyRect.qml
HikButton 1.0 HikButton.qml

6完成后的基本文件结构

在这里插入图片描述
在这里插入图片描述

7 使用

1 建立一个和组件名称相同的文件夹,里面放 qmldir,库生成的dll,qml文件
2 复制到qt的安装目录下的qml夹即可。
在这里插入图片描述

8 更多说明

8.1 上述步骤7中说的文件夹也可以放在任意地方,需要使用的工程做两件事情

1 在pro文件中修改 QML_IMPORT_PATH =     //【目的是在工程中的qml引用库的时候可以找到】

2 在main函数中增加 //engine.addImportPath(“D:/code/qtcodes/IscQML”); // 【目的是运行阶段能找到库】
这里的路径要是步骤7的文件的父目录。比如:C:\Qt\Qt5.12.0\5.12.0\mingw73_64\qml
* 感觉qml非常依赖于文件路径和文件名称】
3 使用工程的qml中包含 库名称和版本即可,如下
在这里插入图片描述
如果上图中红色下划线部分提示错误,可以尝试重启qtCreator.类似于vs studio中的重新扫描。

8.2 如果要让自定义控价的qml内容不可见,编译进dll。

1 需要重写
void xxx(控件名称)::registerTypes(const char *uri)
{
Q_UNUSED(uri);
Q_INIT_RESOURCE(Qml);
}
2 其他问题后面补。

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
假设需求是需要一个带有圆角边框的按钮,我们可以通过自定义组件实现。 首先,创建一个新的 QML 文件,命名为 `RoundButton.qml`。在该文件中,定义一个带有圆角边框的矩形,并在其内部放置一个按钮。 ``` import QtQuick 2.0 import QtQuick.Controls 2.0 Item { property alias text: button.text property alias font: button.font property alias textColor: button.textColor property alias backgroundColor: button.backgroundColor property alias hoverEnabled: button.hoverEnabled Rectangle { id: background color: backgroundColor radius: 10 border.width: 2 border.color: "black" width: button.width + 20 height: button.height + 20 Button { id: button anchors.centerIn: parent text: "Button" font.pixelSize: 24 textColor: "white" hoverEnabled: true background: Rectangle { color: hoverEnabled ? "#2c3e50" : "#34495e" radius: 10 } } } } ``` 在这个自定义组件中,我们提供了一些属性,如文本、字体、文本颜色、背景颜色和悬停效果等。通过这些属性,可以在使用该组件时,方便地设置组件的各种属性。 接下来,在主 QML 文件中,我们可以使用这个自定义组件,像使用其他 QML 控件一样。 ``` import QtQuick 2.0 Rectangle { width: 400 height: 400 RoundButton { text: "Click me" font.pixelSize: 20 backgroundColor: "lightblue" textColor: "white" onClicked: console.log("Button clicked") } } ``` 在这个例子中,我们将自定义组件 `RoundButton` 添加到主 QML 文件中,并设置了它的一些属性,如文本、字体、背景颜色和文本颜色等。当用户点击按钮时,会触发 `onClicked` 信号,并在控制台输出一条信息。 通过这样的方式,我们可以方便地使用自定义组件实现特定的需求,并且可以在多个项目中重复使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值