QML入门之创建可重用的组件(一)

我们在日常开发中都会封装一些组件以便于项目内重复利用。QML创建可重用组件一般有两种方法。

  1. 自定义Item
  2. 使用Component创建自定义组件

自定义Item

以一个自定义按钮举例:

javascript 复制代码
import QtQuick 2.12

Rectangle {
    id: root
    // 自定义属性
    property string btnDis: qsTr("button")
    property string pressedColor: "yellow"
    property string normalColor: "gray"
    property int btnw: 80
    property int btnh: 20
    signal btnClicked
    radius: 4

    width: disStr.width> root.width? disStr.width + 8 : btnw
    height: btnh
    color: mouseArea.pressed? pressedColor : normalColor
    
    Text {
        id: disStr
        anchors.centerIn: parent
        text: btnDis
    }

    MouseArea {
      id: mouseArea
      anchors.fill: parent
      onClicked: root.btnClicked()
    }
}

然后再主文件直接使用元素即可:

javascript 复制代码
import QtQuick 2.12
import QtQuick.Window 2.12

Window {
  id:root
  visible: true
  width: 640
  height: 480
  title: qsTr("简单窗口")

  RadiusButton {
    id: loginBtn
    anchors.centerIn: parent
    btnDis: qsTr("马大爷")
    btnh: 25
    pressedColor: "green"

    onBtnClicked: {
      console.log(qsTr("按钮点击了"))
    } 
  }
}

注意:

如果出现找不到组件,则检查下是否将组件添加到了qrc中,如下图:

如果并不是在根目录下则需要import相应的文件夹,如下:

在main.qml中 import "qrc:/ui"即可。

通常,自定义组件时我们会以一个Item作为根节点,可以防止用户通过基本属性改变我们设计的按钮的属性色。修改之后为:

javascript 复制代码
import QtQuick 2.12
Item {
  id: root
  // 自定义属性
  property string btnDis: qsTr("button")
  property string pressedColor: "yellow"
  property string normalColor: "gray"
  property int btnw: 80
  property int btnh: 20
  signal btnClicked

  width: rect.width
  height: rect.height

  Rectangle {
    id: rect
    anchors.fill: parent
    radius: 4

    width: disStr.width> rect.width? disStr.width + 8 : btnw
    height: btnh
    color: mouseArea.pressed? pressedColor : normalColor
    
    Text {
        id: disStr
        anchors.centerIn: parent
        text: btnDis
    }

    MouseArea {
      id: mouseArea
      anchors.fill: parent
      onClicked: root.btnClicked()
    }
  }
}

其中,disStr.width> rect.width? disStr.width + 8 : btnw 即自适应按钮文字大小。

相关推荐
Ricardo于12 天前
★3.3 事件处理
qml
梦起丶12 天前
Qml 中实现时间轴组件
qt·ui·时间轴·控件·qml
梦起丶12 天前
Qml 中实现任意角为圆角的矩形
qt·ui·控件·qml
码农客栈12 天前
qml XmlListModel详解
qml
小灰灰搞电子15 天前
QML states和transitions的使用
qt·qml
码农客栈16 天前
qml SpringAnimation详解
qml
人才程序员1 个月前
Windows11 安卓子系统存储位置更改
android·c语言·c++·qt·qml·界面
瀛洲客1 个月前
Qt6 QML RegularExpressionValidator 输入中文的坑
qt·qml·中文·汉字输入
梦起丶1 个月前
Qml 中实现毛玻璃效果
qt·ui·qml·毛玻璃