在开发QtQuick项目时,对于界面上的控件Controls往往会重复使用,单个界面上会有多个同样的Controls。在调用系统Controls库时,往往一些属性,如字体、样式、大小等需要多次去编写,造成代码重复冗余,而且一些项目要求的特殊属性系统Controls也无法全部满足,因此,在QtQuick项目中,自定义自己项目的控件对于项目的开发具有很大好处。

QT对于QtQuick.Controls库提供的1.0和2.0版本,两个版本的相同控件并不支持混用,同时QtQuick.Controls的Button控件无法直接指定字体大小等属性,无法满足指定属性项目的需求,因此需要自定义此Controls。因此本文对于1.0和2.0版本的Button给出了两个自定义的控件版本,具体自定义实现见下文。

1.0版本自定义Button

1.0版本即qml文件头引入QtQuick.Controls 1.0 - 1.4库的适用版本,具体见自定义控件代码:

/*
* 自定义QML Button控件
* Since:Qt 5.1 采用QtQuick.Controls 1.4库(1.0版)
* 此方式同样也可采用2.0版本方式定义
*/import QtQuick 2.12
import QtQuick.Controls 1.4Rectangle {id: control;// 定义Button字体属性property alias text: buttonText.text; // 按钮名称property alias fontSize: buttonText.font.pixelSize; // 名称字体大小property alias fontFamily: buttonText.font.family;  // 名称字体样式// 定义Button可响应信号signal clicked; // 单击signal doubleClicked; // 双击signal pressed; // 压signal released;signal entered;signal exited;// 定义Button形状implicitWidth: 60;       // 最小宽度implicitHeight: 30;      // 最小高度color: control.enabled ? (mouse.pressed ? "#0b81ff" : "transparent") : "#E5E5E5"; // 自定义Button颜色border.width: 1;         // 边框宽度border.color: mouse.hovered ? "#0b81ff" : "#E5E5E5"; // 边框颜色radius: 5;               // 弧度// 定义按钮名称Text {id: buttonText;anchors.centerIn: parent;text: control.text;font.pixelSize: 12; // 默认字体大小font.family: "Microsoft YaHei"; // 字体样式color: "#333333"; // 字体颜色renderType: Text.NativeRendering; // 防止字体模糊}// 定义按钮鼠标点击事件MouseArea {id: mouse;anchors.fill: parent;hoverEnabled: true; // 悬停事件使能onEntered: {control.entered();}onExited: {control.exited();}onClicked: {control.clicked();}onDoubleClicked: {control.doubleClicked();}onPressed: {control.pressed();}onReleased: {control.released();}}
}

此版本的Button,由外框矩形和内部Text组成,按钮的事件信号由鼠标事件定义完成。

1.0版本自定义Button有如下的缺点:

1. button的背景大小无法自适应按钮文文字大小,需求根据当前的按钮名称指定按钮宽度。

2. 无法监测鼠标悬停事件。

3. 控件本身鼠标焦点在选中后难以转移,会出现点击其他控件出现两次才会响应,可采用forceActiveFocus()函数来转移焦点。

2.0版本自定义Button

2.0版本即qml文件头引入QtQuick.Controls 2.0 - 2.12库的适用版本,具体见自定义控件代码:

/*
* 自定义QML Button控件
* Since:Qt 5.7 采用QtQuick.Controls 2.12库(2.0版)
*/import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Controls.impl 2.12
import QtQuick.Templates 2.12 as TT.Button {id: control;property alias fontSize: control.font.pixelSize; // 名称字体大小property alias fontFamily: control.font.family;  // 名称字体样式// 按钮属性implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,implicitContentHeight + topPadding + bottomPadding); // 最小高度implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,implicitContentWidth + leftPadding + rightPadding);   // 最小宽度hoverEnabled: true;padding: 6; spacing: 6;horizontalPadding: padding + 2;  //2.0版本属性font.family: "Microsoft YaHei";font.pixelSize: 12;// 按钮名称属性contentItem: Label {height: back.height;width: back.width;horizontalAlignment: Text.AlignHCenter;verticalAlignment: Text.AlignHCenter;  // 字体位置 水平和垂直的中心text: control.text;font: control.font;color: "#333333";renderType: Text.NativeRendering;}// 按钮背景属性background: Rectangle {id: back;implicitWidth: 60;implicitHeight: 30;visible: !control.flat || control.down || control.checked || control.highlighted;color: control.enabled ? (control.pressed ? "#0b81ff" : "transparent") : "#E5E5E5";border.width: 1;border.color: control.hovered ? "#0b81ff" : "#E5E5E5";radius: 5;}
}

自定义2.0版本的Button的属性于目前使用来说,体验比较良好,如果项目不要求版本,建议使用此版本的自定义Button。

自定义Button应用

在main.qml中使用自定义的Controls Button时,需先引入定义此控件的路径,并且最好将包含自定义控件的的路径as成专用的首字母大写的关键字,如下代码:

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 2.12
import "myControl" as MyWindow {visible: true;width: 640;height: 480;title: qsTr("自定义Control");My.Botton1 {id: button1;anchors.top: parent.top;anchors.topMargin: 30;anchors.left: parent.left;anchors.leftMargin: 50;width: 110;   // 指定适应text宽度的 按钮宽度text: qsTr("Control 1.4版本");onClicked: {console.log("单击");}}My.Button2 {id: button2;anchors.top: button1.bottom;anchors.topMargin: 30;anchors.left: parent.left;anchors.leftMargin: 50;text: qsTr("Control 2.12版本");onClicked: {console.log("单击");}}Button {id: button;anchors.top: button2.bottom;anchors.topMargin: 30;anchors.left: parent.left;anchors.leftMargin: 50;text: qsTr("Qt库 版本");/*// 字体// 名称contentItem: Label {}// 背景background: Rectangle {}*/onClicked: {console.log("单击");}}}

如上面代码所示,自定义控件可省去大多重复代码,并且可以只需要改变很少的属性就可以改变每个控件的独立属性,比较推荐使用。运行后的展示如下:

欢迎各位大佬评论,私信指正。

QML 自定义控件Button,采用QtQuick.Controls 1.0和2.0两版本实现相关推荐

  1. QML自定义控件Button

    QT自带的Button无法满足我们的审美,和需求,为此项目开发中经常需要自定义控件,以Button控件为例 联系作者 qq 843230304 效果图(里面的按钮都是Button):还有好多呢,你只需 ...

  2. QML之在QtQuick.Controls 2项目中使用QtQuick.Controls模块中的控件

    区别 下面的笔记中将QtQuick.Controls 2简称为qml2,QtQuick.Controls简称为qml1. 最直观的的区别就是qml2的控件及界面风格更加美观,qml2提供了一套谷歌风格 ...

  3. QML QtQuick.Controls 2 ScrollBar滚动条样式自定义

    测试版本:Qt5.12及Qt5.15 ,参考Qt源码及文档示例 代码链接:https://github.com/gongjianbo/QmlComponentStyle.git 自定义样式与默认样式的 ...

  4. QML 自定义控件 时间滚筒控件

    QML 仿手机时间滚筒控件 效果:共3中模式  "Date" | "Time" | "DateTime" main.qml MouseAre ...

  5. qml自定义控件----自定义菜单

    效果 摘要 这段时间在写树的时候需要用到右键菜单,但是原生的不太好看,且用起来有点僵硬(不太熟悉),于是抱着手艺人的素养,就自己鼓捣了一个出来,虽然不一定非常通用,但是自己做出来的使用比较方便,后期的 ...

  6. QtQuick.Controls 2与 QtQuick.Controls的区别和使用

    混合使用 直接在代码中同时调用QtQuick.Controls 2模块和QtQuick.Controls 模块会出错,因为只能识别到一个版本的控件,会出现无法识别QtQuick.Controls 2的 ...

  7. qml学习---------------Button属性

    本来学习了qml中的button,其实qml中的button跟qtQPushButton以及其他语言中的按钮是相同的. 首先通过一个简单的例子来学习button. import QtQuick 2.2 ...

  8. QtQuick controls和controls2 自定义样式

    2019独角兽企业重金招聘Python工程师标准>>> controls import QtQuick 2.7 import QtQuick.Controls 1.4 import ...

  9. 标致新408全球首发采用全新狮标;三星电子公布0.56微米2亿像素图像传感器 | 美通企业日报...

    美通社要闻摘要: 标致新408全球首发采用全新狮标.三星电子公布0.56微米2亿像素图像传感器.柏中精密机械加工联盟升级定制化零件服务.力克推出汽车裁剪房 4.0.箩筐旗下泓达九通与西门子交通全资子公 ...

最新文章

  1. 阿里技术嘉年华-aDev内容感悟
  2. HDFS底层原理系列讲解之fsimage、editslog
  3. 算法学习--Day5
  4. @ComponentScan.Filter type的类型
  5. (转)Predictive learning vs. representation learning 预测学习 与 表示学习
  6. hihocoder-Week173--A Game
  7. ubuntu 设置分辨率 亲测可用 转载的
  8. 成员变量的声明位置引起编译错误
  9. 两台服务器安装redis集群_redis 集群搭建,小白也能搭三主三从的集群环境
  10. 推荐!京东开源姿态跟踪新框架LightTrack!
  11. power bi 地图_如何使用Power BI创建地理地图-填充地图和气泡地图
  12. busybox linux内核,使用busybox创建精简linux内核实例
  13. IDEA回到光标的上一次位置
  14. 有关计算机学的心得体会,关于计算机学习心得体会大全
  15. 局域网ip扫描工具_IP Scanner Pro——ip局域网扫描工具
  16. 软件工程保研成功率_软件工程专业保研还是工作?
  17. 微信公众号跳转到关注页面
  18. OpenERP中多币种处理(外币处理)
  19. 苹果连不上电脑服务器未响应,苹果电脑服务器未响应怎么办
  20. VB6不能加载MSCOMCTL.OCX

热门文章

  1. 工业低频RFID应用系列三:JY-V640半导体RFID读写器|FOUP晶圆盒读写头应用场景剖析
  2. Python实例14:将彩色图片变成手绘铅笔图片
  3. 脑电图(EEG)学习资料汇总:在线视频教程、学习网站、书籍教材
  4. HTML5用canvas制作飞机大战小游戏
  5. 在Linux上的安装Tomcat
  6. 趋势反转交易策略指南
  7. mac系统如何连接共享服务器,mac连接共享服务器设置
  8. python手机解释器_用Python实现一个Python解释器
  9. 联想主板9针开关接线图_主进线开关柜断路器到底有那些功能,保护动作值是如何动作,注意细节...
  10. 数字生活比物质生活更有价值