QML编程指南 VX:hao541022348
- ■ 按钮
- ■ AbstractButton
- ■ Button
- ■ CheckBox
- ■ DelayButton
- ■ RadioButton
- ■ RoundButton🌟
- ■ Switch🌟
- ■ ToolButton🌟
■ 按钮
■ AbstractButton
所有的按钮控件的父类都是 AbstractButton 。
AbstractButton 里面有按钮的样式外观包括文字图标等、点击、checked、还有就是可以配置菜单action。
1. 按下是否重复
像下面这些属性,就是 一个按钮一直被按下不释放,那这个还继续响应按钮的事件不?就怕按下一直发信号,在某些使用场景就不适合,但是有些场景就需要用到的。
- autoRepeat 默认是false .
2. 图标和文字展示情况 - display : enumeration
3. 信号介绍
名称 | 含义 |
---|---|
canceled() | 当被按下时,鼠标失去了对按钮的抓取,或者当它发出释放信号,但鼠标光标不在按钮内部时,就会发出这个信号。 |
clicked() | 当被按下时,鼠标失去了对按钮的抓取,或者当它发出释放信号,但鼠标光标不在按钮内部时,就会发出这个信号。 |
doubleClicked() | 当用户通过触摸或鼠标交互式地双击按钮时,就会发出这个信号。 |
pressAndHold() | 当用户通过触摸或鼠标交互式地按下并按住按钮时,就会发出这个信号。当启用autoRepeat时不会触发。 |
pressed() | 当用户通过触摸、鼠标或键盘交互式地按下按钮时,就会发出这个信号。 |
released() | 当用户通过触摸、鼠标或键盘交互地释放按钮时,就会发出这个信号。 |
toggled() | 当用户通过触摸、鼠标或键盘交互切换可检查按钮时,就会发出这个信号。 |
4. 自带方法介绍
这个就只有一个槽函数:
- void toggle()
就是 切换按钮到选中状态。
■ Button
QtQuick.Controls 的 Button 表示用户可以按下或单击的按钮控件。这个控件其实就是代表一个按钮.
Button 是继承至 AbstractButton, 那Button就可以使用他的父类的一些功能。我们就可以设置 text, 展示一个图标 icon, 以及响应 clicks 点击事件之类的。
- flat : bool 指示这个按钮是否是 flat 按钮,平面按钮通常不会绘制背景,除非它被按下或选中。默认值为false。
- highlighted : bool 这个属性保存按钮是否高亮显示
事件处理
属性 | 描述 |
---|---|
信号 | |
canceled() | 当被按下时,鼠标失去了对按钮的抓取,或者当它发出释放信号,但鼠标光标不在按钮内部时,就会发出这个信号。 |
clicked() | 当用户通过触摸、鼠标或键盘交互式地单击按钮时,就会发出这个信号。 |
doubleclick () | 当用户通过触摸或鼠标交互式地双击按钮时,就会发出这个信号。 |
pressAndHold () | 当用户通过触摸或鼠标交互式地按下并按住按钮时,就会发出这个信号。当启用autoRepeat时不会触发。 |
pressed() | 当用户通过触摸、鼠标或键盘交互式地按下按钮时,就会发出这个信号。 |
released() | 当用户通过触摸、鼠标或键盘交互地释放按钮时,就会发出这个信号。 |
toggled() | 当用户通过触摸、鼠标或键盘交互切换可检查按钮时,就会发出这个信号。这个信号在QtQuick中引入。对照组2.2 (Qt 5.9)。 |
示例一:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Row{
Button{
text:"OK"
Layout.column: 0
Layout.alignment: Qt.AlignHCenter
onClicked:
console.log("Ok Btn Clicked!")
}
Button{
text:"Apply"
Layout.column: 1
Layout.alignment: Qt.AlignHCenter
onPressed:
{
console.log("Apply Btn Pressed!")
}
}
}
}
定制外观
Button 有两个 visual 子控件: background 和content item.,我们就重写这个就好啦,很简单的
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button {
id: selfBtn
text: qsTr("Button")
contentItem: Text {
text: selfBtn.text
font: selfBtn.font
opacity: enabled ? 1.0 : 0.3
color: selfBtn.down ? "#17a81a" : "#21be2b"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
background: Rectangle {
implicitWidth: 100
implicitHeight: 40
opacity: enabled ? 1 : 0.3
border.color: selfBtn.down ? "#17a81a" : "#21be2b"
border.width: 1
radius: 2
}
}
}
填充效果
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button {
id: selfBtn
text: qsTr("Button")
contentItem: Text {
text: selfBtn.text
font: selfBtn.font
opacity: enabled ? 1.0 : 0.3
color: selfBtn.down ? "white" : "#e6f6e7"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
background: Rectangle {
implicitWidth: 100
implicitHeight: 40
opacity: enabled ? 1 : 0.3
border.color: selfBtn.down ? "#17a81a" : "#21be2b"
color: selfBtn.down ? "#17a81a" : "#21be2b"
border.width: 1
radius: 2
}
}
}
■ CheckBox
CheckBox 提供了一个选项按钮,也叫复选框,可以打开(选中)或关闭(未选中)。复选框通常用于从一组选项中选择一个或多个选项。
示例一:
ColumnLayout {
CheckBox {
checked: true
text: qsTr("First")
}
CheckBox {
text: qsTr("Second")
}
CheckBox {
checked: true
text: qsTr("Third")
}
}
示例二
Column {
ButtonGroup {
id: childGroup
exclusive: false
checkState: parentBox.checkState
}
CheckBox {
id: parentBox
text: qsTr("Parent")
checkState: childGroup.checkState
}
CheckBox {
checked: true
text: qsTr("Child 1")
leftPadding: indicator.width
ButtonGroup.group: childGroup
}
CheckBox {
text: qsTr("Child 2")
leftPadding: indicator.width
ButtonGroup.group: childGroup
}
}
示例三外观定制
import QtQuick 2.12
import QtQuick.Controls 2.12
CheckBox {
id: control
text: qsTr("CheckBox")
checked: true
indicator: Rectangle {
implicitWidth: 26
implicitHeight: 26
x: control.leftPadding
y: parent.height / 2 - height / 2
radius: 3
border.color: control.down ? "#17a81a" : "#21be2b"
Rectangle {
width: 14
height: 14
x: 6
y: 6
radius: 2
color: control.down ? "#17a81a" : "#21be2b"
visible: control.checked
}
}
contentItem: Text {
text: control.text
font: control.font
opacity: enabled ? 1.0 : 0.3
color: control.down ? "#17a81a" : "#21be2b"
verticalAlignment: Text.AlignVCenter
leftPadding: control.indicator.width + control.spacing
}
}
示例四:
CheckBox {
id: control
text: qsTr("CheckBox")
checked: true
leftPadding: indicator.width
ButtonGroup.group: childGroup
indicator: Rectangle {
implicitWidth: 22
implicitHeight: 22
x: control.leftPadding
y: parent.height / 2 - height / 2
radius: 11
border.color: control.down ? "#17a81a" : "#21be2b"
Rectangle {
width: 10
height: 10
x: 6
y: 6
radius: 5
color: control.down ? "#17a81a" : "#21be2b"
visible: control.checked
}
}
contentItem: Text {
text: control.text
font.pixelSize: 14
opacity: enabled ? 1.0 : 0.3
color: control.down ? "#17a81a" : "#21be2b"
verticalAlignment: Text.AlignVCenter
padding: control.indicator.width + control.spacing
}
}
■ DelayButton
DelayButton 是一个 check 按钮,在按钮被 check 并发出activated()信号之前包含了一个延迟。这种延迟可以防止意外按下按钮。很像长按加速的效果功能。
当前进度用一个介于0.0到1.0之间的十进制值表示。activation()触发所需的时间以毫秒为单位,可以通过delay属性来设置。
进度由按钮上的进度指示器指示。
示例一:
Column {
id: column
anchors.fill: parent
DelayButton
{
text:"长按加速"
anchors.horizontalCenter: parent.horizontalCenter
Layout.alignment: Qt.AlignCenter
}
}
示例二 定制化
DelayButton {
id: control
checked: true
text: qsTr("Delay\nButton")
Layout.alignment: Qt.AlignHCenter
anchors.horizontalCenter: parent.horizontalCenter
contentItem: Text {
text: control.text
font: control.font
opacity: enabled ? 1.0 : 0.3
color: "white"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
background: Rectangle {
implicitWidth: 100
implicitHeight: 100
opacity: enabled ? 1 : 0.3
color: control.down ? "#17a81a" : "#21be2b"
radius: size / 2
readonly property real size: Math.min(control.width, control.height)
width: size
height: size
anchors.centerIn: parent
Canvas {
id: canvas
anchors.fill: parent
Connections {
target: control
onProgressChanged: canvas.requestPaint()
}
onPaint: {
var ctx = getContext("2d")
ctx.clearRect(0, 0, width, height)
ctx.strokeStyle = "white"
ctx.lineWidth = parent.size / 20
ctx.beginPath()
var startAngle = Math.PI / 5 * 3
var endAngle = startAngle + control.progress * Math.PI / 5 * 9
ctx.arc(width / 2, height / 2, width / 2 - ctx.lineWidth / 2 - 2, startAngle, endAngle)
ctx.stroke()
}
}
}
}
■ RadioButton
RadioButton,也叫单选按钮,可以打开(选中)或关闭(未选中)。单选按钮通常用于从一组选项中选择一项。也就是多选1的方式
示例一:
import QtQuick 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.3
import QtQuick.Controls 2.5
Window {
id: window
ColumnLayout
{
anchors.fill: parent
RadioButton
{
text: "模式1"
Layout.alignment: Qt.AlignHCenter
}
RadioButton
{
text: "模式2"
Layout.alignment: Qt.AlignHCenter
}
RadioButton
{
text: "模式3"
Layout.alignment: Qt.AlignHCenter
}
}
}
■ RoundButton🌟
RoundButton和Button是一样的,除了它有一个radius属性,这个属性允许圆角,而不必自定义背景。功能和Button完全一样的。
示例一:
import QtQuick 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.3
import QtQuick.Controls 2.5
Window {
id: window
width: 300
height: 300
ColumnLayout
{
anchors.fill: parent
RoundButton
{
text: "圆角按钮"
Layout.preferredWidth: 80
Layout.preferredHeight: 30
radius: 5
Layout.alignment: Qt.AlignHCenter
}
}
}
示例二
import QtQuick 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.3
import QtQuick.Controls 2.5
Window {
id: window
width: 300
height: 300
RoundButton
{
id:control
text: "圆角按钮"
Layout.preferredWidth: 80
Layout.preferredHeight: 30
radius: 10
Layout.alignment: Qt.AlignHCenter
contentItem: Text {
text: control.text
font: control.font
opacity: enabled ? 1.0 : 0.3
color: control.down ? "#17a81a" : "#21be2b"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
background: Rectangle {
implicitWidth: 100
implicitHeight: 40
opacity: enabled ? 1 : 0.3
border.color: control.down ? "#17a81a" : "#21be2b"
border.width: 1
radius: 5
}
}
}
■ Switch🌟
Switch 是一个单选按钮,其实就是叫开关控件的嘛,可以拖动或打开(选中)或关闭(未选中)。
Switch 通常用于在两种状态之间进行选择。对于较大的选项集,如列表中的选项,请考虑使用SwitchDelegate。
示例一:
import QtQuick 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.3
import QtQuick.Controls 2.5
Window {
id: window
width: 300
height: 300
ColumnLayout
{
anchors.fill: parent
Switch {
text: qsTr("Wi-Fi")
Layout.alignment: Qt.AlignHCenter
}
}
}
示例二 定制化
Switch {
id: swit
text: qsTr("WI-Fi")
Layout.alignment: Qt.AlignHCenter
indicator: Rectangle {
implicitWidth: 48
implicitHeight: 26
x: swit.leftPadding
y: parent.height / 2 - height / 2
radius: 13
color: swit.checked ? "#17a81a" : "#ffffff"
border.color: swit.checked ? "#17a81a" : "#cccccc"
Rectangle {
x: swit.checked ? parent.width - width : 0
width: 26
height: 26
radius: 13
color: swit.down ? "#cccccc" : "#ffffff"
border.color: swit.checked ? (swit.down ? "#17a81a" : "#21be2b") : "#999999"
}
}
contentItem: Text {
text: swit.text
font: swit.font
opacity: enabled ? 1.0 : 0.3
color: swit.down ? "#17a81a" : "#21be2b"
verticalAlignment: Text.AlignVCenter
leftPadding: swit.indicator.width + swit.spacing
}
}
■ ToolButton🌟
示例一:
ToolBar {
RowLayout {
anchors.fill: parent
ToolButton {
text: qsTr("‹")
onClicked: stack.pop()
}
Label {
text: "Title"
elide: Label.ElideRight
horizontalAlignment: Qt.AlignHCenter
verticalAlignment: Qt.AlignVCenter
Layout.fillWidth: true
}
ToolButton {
text: qsTr("⋮")
onClicked: menu.open()
}
}
}
示例二:
import QtQuick 2.12
import QtQuick.Controls 2.12
ToolButton {
id: control
text: qsTr("ToolButton")
width: 120
contentItem: Text {
text: control.text
font: control.font
opacity: enabled ? 1.0 : 0.3
color: control.down ? "#17a81a" : "#21be2b"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
background: Rectangle {
implicitWidth: 40
implicitHeight: 40
color: Qt.darker("#33333333", control.enabled && (control.checked || control.highlighted) ? 1.5 : 1.0)
opacity: enabled ? 1 : 0.3
visible: control.down || (control.enabled && (control.checked || control.highlighted))
}
}