首页 > 其他分享 >QML之SpinBox

QML之SpinBox

时间:2024-03-28 09:00:53浏览次数:24  
标签:control color text SpinBox value width QML border

今天使用SpinBox,为了使界面风格统一,需要修改控件的边框颜色,文本颜色,点击时的背景颜色和文本颜色,这时需要对SpinBox作一定程度的定制化。

首先简单说明下SpinBox的参数:

  • displayText: 这是一个只读属性,表示SpinBox中显示的文本值。它等同于spinBox.textFromValue(spinBox.value, spinBox.locale)的结果。
  • editable: 这是一个布尔值,表示SpinBox是否可以编辑。如果设置为true,用户可以直接在SpinBox中输入数值。
  • down: 这是指向下指示器相关的属性组,包括:
    • down.hovered: 布尔值,表示鼠标是否悬停在向下指示器上。
    • down.implicitIndicatorHeight: 实数,定义向下指示器的高度。如果未设置,则使用隐式高度。
    • down.implicitIndicatorWidth: 实数,定义向下指示器的宽度。如果未设置,则使用隐式宽度。
    • down.indicator: Item类型,定义向下指示器的自定义元素。
    • down.pressed: 布尔值,表示向下指示器是否被按下。
  • up: 这是指向上指示器相关的属性组,包括:
    • up.hovered: 布尔值,表示鼠标是否悬停在向上指示器上。
    • up.implicitIndicatorHeight: 实数,定义向上指示器的高度。如果未设置,则使用隐式高度。
    • up.implicitIndicatorWidth: 实数,定义向上指示器的宽度。如果未设置,则使用隐式宽度。
    • up.indicator: Item类型,定义向上指示器的自定义元素。
    • up.pressed: 布尔值,表示向上指示器是否被按下。
  • from:起始值,默认是0
  • to:最大值,默认是99
  • stepSize:步长
  • textFromValue: 一个Javascript函数,用来把一个数字映射成一个字符串显示在界面上
  • valueFromText: 一个Javascript函数,作用和textFromValue相反

SpinBox主要有三部分组成:左右两个按钮,可以点击,中间一个文本框,用来显示数字或者其他文本。

左右两个按钮对应SpinBox的down.indicator和up.indicator参数,

文本框对应Control的contentItem参数.

弄清除了上面两条信息后,就可以开始自定这个控件了,唯一需要注意的是,左右两个按钮的大小需要设置正确,不然会显示不出来,这里需要用implicitHeight参数而不是height参数(宽度设置同理)。

继承标准的SpinBox,代码如下:

import QtQuick 2.15
import QtQuick.Controls 2.15

SpinBox {
    id:control
    width: 80
    height: 25

    property color border_color: "#B0E3F9"
    property color bkg_color: "#2C3E50"
    property color pressed_bkg_color: "#B0E3F9"
    property color txt_color:  "#B0E3F9"
    property color txt_sel_color:  "#2C3E50"

    background: Rectangle{
        border.width: 1
        border.color: border_color
        color: "transparent"
    }

    contentItem: TextInput{
            text: control.displayText
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
            overwriteMode: true
            selectByMouse: true
            color: txt_color
            selectionColor: txt_color
            selectedTextColor: bkg_color
        }

    down{
        indicator: Rectangle{
            x:0
            y:0
            implicitHeight: parent.height
            implicitWidth: parent.height
            color: control.down.pressed ? pressed_bkg_color : bkg_color
            border.width: 1
            border.color: txt_color
            Text{
                anchors.centerIn: parent
                text: "-"
                color: control.down.pressed ? bkg_color :txt_color
            }
        }
    }

    up{
        indicator: Rectangle{
            x:parent.width - width
            y:0
            implicitHeight: parent.height
            implicitWidth: parent.height
            color: control.up.pressed ? pressed_bkg_color : bkg_color
            border.width: 1
            border.color: txt_color
            Text{
                anchors.centerIn: parent
                text: "+"
                color: control.up.pressed ? bkg_color :txt_color
            }
        }
    }

}

使用Rectangle,InputBox, Timer的控件来模拟实现SpinbBox的功能,作为练习代码,功能也简单以下:

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts

Rectangle {
    id: control
    width: 80
    height: 30

    property int from: 0
    property int to: 100
    property int step: 1
    property int value: 22
    property color text_color: "#B0E3F9"

    border.width: 1
    border.color:  text_color
    color:"transparent"
    RowLayout{
        anchors.fill: parent
        spacing:0
        Rectangle{
            Layout.fillHeight: true
            Layout.margins: control.border.width
            Layout.preferredWidth: parent.height-2*control.border.width
            color:subMouseArea.containsPress ? Qt.darker(text_color, 2) : "transparent"
            Label{
                anchors.centerIn: parent
                text:"-"
                color: subMouseArea.containsPress ? Qt.lighter(text_color, 1.5) : text_color
            }
            MouseArea{
                id:subMouseArea
                anchors.fill: parent
                onClicked: {
                    control.value = control.value-1
                    if(control.value < control.from)
                        control.value = from;
                }
                onPressed: {
                    subTimer.start()
                }

                onReleased: {
                    subTimer.stop()
                    subTimer.interval = 200
                }
            }
        }
        Rectangle{
            Layout.fillHeight: true
            width: control.border.width
            color: text_color
        }
        TextInput{
            Layout.fillHeight: true
            Layout.fillWidth: true
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
            overwriteMode: true
            selectByMouse: true
            text: control.value
            color: text_color
            onAccepted: {
                if(isNaN(text)){
                    text = control.value
                }
                else{
                    control.value = text
                }
            }
        }
        Rectangle{
            Layout.fillHeight: true
            width: control.border.width
            color: text_color
        }
        Rectangle{
            Layout.fillHeight: true
            Layout.margins: control.border.width
            Layout.preferredWidth: parent.height-2*control.border.width
            color:addMouseArea.containsPress ? Qt.darker(text_color, 2) : "transparent"

            Label{
                anchors.centerIn: parent
                text:"+"
                color: addMouseArea.containsPress ? Qt.lighter(text_color, 1.5) : text_color
            }
            MouseArea{
                id: addMouseArea
                anchors.fill: parent

                onClicked: {
                    control.value = control.value+1
                    if(control.value > control.to)
                        control.value = control.to
                }

                onPressed: {
                    addTimer.start()
                }

                onReleased: {
                    addTimer.stop()
                    addTimer.interval = 200
                }
            }
        }
    }

    Timer{
        id: addTimer
        interval: 200
        repeat: true
        running: false
        onTriggered: {
            if(interval == 200)
                interval = 100
            control.value = control.value+1
            if(control.value > control.to)
                control.value = control.to
        }
    }

    Timer{
        id: subTimer
        interval: 200
        repeat: true
        running: false
        onTriggered: {
            if(interval == 200)
                interval = 100
            control.value = control.value-1
            if(control.value < control.from)
                control.value = control.from
        }
    }
}

下图中的两个SpinBox就是上面两种实现方式的效果:

标签:control,color,text,SpinBox,value,width,QML,border
From: https://blog.csdn.net/qq_33271629/article/details/137089472

相关文章

  • 使用cmake组织QML工程代码
    使用cmake组织c++代码,一般的流程大概是:       1、创建一个可执行文件A       2、设置A需要的源文件       3、设置A的编译源文件时用到的头文件路径       4、设置A依赖的动态库或静态库       5、设置编译选项       ......
  • qml使用c++的类
    QML使用C++的类qmlobjectdefine.h#ifndefQMLOBJECTDEFINE_H#defineQMLOBJECTDEFINE_H#include<qobjectdefs.h>#include<qqml.h>#defineQML_FUNCTIONQ_INVOKABLE#defineQML_MEMBER_NAME(NAME)......
  • QML Date对象处理日期和时间
    一.QML Date介绍在QML中,Date对象用于处理日期和时间。以下是关于Date对象的详细介绍:构造方法:newDate():创建一个代表当前日期和时间的Date对象。newDate(value):根据自1970年1月1日以来的毫秒数创建一个Date对象。newDate(dateString):根据给定的字符串创建一个Date对象。......
  • Qt 无法连接到进程内QML调试器
    问题:由于在Qt5以上版本默认开启QML调试器造成的。用于告知用户,这将打开一个到运行QML的Javascript解释器的端口,以便从中获得调试输出。显然,这会造成一个安全漏洞,所以在不安全的地方使用时应该关闭它(在释放运行时自动关闭)。Qt4默认不开启QML调试器,而Qt5版本以上默认开启。......
  • Qt 编写的qml程序全屏时,挡住系统虚拟键盘的解决办法
    官方有提到该问题。尤其是使用qml时,一定会出现这个遮挡问题。https://doc.qt.io/qt-5/windows-issues.html 默认的qml工程的解决代码如下:1...2#include<QWindow>3#include<QtPlatformHeaders/QWindowsWindowFunctions>4...56intmain(intargc,char*arg......
  • Qt QML 虚拟键盘(VirtualKeyboard )
    简介Qt官方开源了一个虚拟键盘的示例,该示例提供两种使用方式:一种用于桌面平台,另一种用于嵌入式平台,示例采用嵌入式平台方式显示。它们区别是前者脱离窗口应用于全局,后者依附于窗口。示例在QtCreator软件可以找到:或在以下Qt安装目录找到:C:\Qt\{你的Qt版本}\Examples......
  • Qt QML使用虚拟键盘示例(附完整源码)
    使用"虚拟键盘"注意(例子的Qt版本:5.12.4)注意一:     /*必须在main.cpp开始处加入如下代码,否则无法使用"虚拟键盘"*/     qputenv(“QT_IM_MODULE”,QByteArray(“qtvirtualkeyboard”)); 注意二:     键盘大小是根据宽度自动计算的,所以,应用程序应该只设置Inpu......
  • 初学 qml - Learn Qml from Scratch
    前言之前项目都是用Qt/C++/Widget方式来开发,项目组中对这种模式运用的比较成熟(这里成熟应带引号),因为会用C++基本就行,而且调试也比较方便(qtcreator+gdb)。但使用过程中也发现一些问题。比如C++一般写逻辑在行,写界面用起来很麻烦,代码量大(虽然这一点可以借助designer来简化界面......
  • Qt - 打包程序:含QWidget和QML
    简介项目完成之后,就需要打包发布,即可直接将打包程序拷贝到其他设备上运行 打包QWidget项目 1、以win11为例,在开始菜单中找到Qt,看到下图红框中的终端2、选择自己需要使用的构建套件版本,其中MinGW、MSVC、32bit,64bit这几个点是需要看清楚的否则打包后运行exe会出现0xc000......
  • 【Qt之Quick模块】6. QML语法详解_3 QML对象特性
    概述每一个QML对象类型都包含一组已定义的特性。当进行实例时都会包含一组特性,这些特性是在对象类型中定义的。一个QML文档中的对象类型声明了一个新的类型,即实例出一个类型。其中包含以下特性。theidattribute :id特性propertyattributes :属性特性signalattributes ......