GUI学习之十四——QAbstractSpinBox学习总结

QAbstractSpinBox是一个抽象类,是将所有步长调节器的通用的功能抽象出了一个父类。虽然QAbstractSpinBox是一个抽象类,但是可以直接实例化使用。QAbstractSpinBox包含了一个QLineEdit和两个QPushbutton。数据的更改可以通过点击按钮或使用键盘输入。

由于QAbstractSpinBox是个基类,没有对按钮的事件进行定义,控件中的按钮点击是没有效果的,想要有效果需要对类进行重写

from PyQt5.Qt import *
import sys
class MyASB(QAbstractSpinBox):
    def stepEnabled(self):
        current = int(self.text())
        if current == 0:
            return QAbstractSpinBox.StepUpEnabled
        elif current == 9999:
            return QAbstractSpinBox.StepDownEnabled
        elif current<0 or current>9999:
            return QAbstractSpinBox.StepNone
        else:
            return QAbstractSpinBox.StepUpEnabled| QAbstractSpinBox.StepDownEnabled

    def stepBy(self, steps: int):
        current =int(self.text())
        self.lineEdit().setText(str(steps+current))
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.UI_test()

    def UI_test(self):
        asb = MyASB(self)
        asb.move(100,100)
        asb.resize(200,40)
        asb.setAccelerated(True)
        pass
if __name__ == ‘__main__‘:
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

QAbstractSpinBox的子类化使用模拟

这样就能实现用按钮在0-9999之间加减,超出范围是没有效果的

在后面的演示中为了方便我们都用上面的子类来演示(数值变化范围0-9999)。

1.长按按钮累计加速

在默认情况下使用按钮对数据进行累计时数据是匀速变化的,还可以使它加速变化

QAbstractSpinBox.setAccelerated(True)
QAbstractSpinBox.isAccelerated() 

2.只读设置

这个只读是用户不能使用键盘输入数据,但是可以用鼠标点击按钮来实现数据的更改。

QAbstractSpinBox.setReadOnly(True)
QAbstractSpinBox.isReadOnly()

3.内容设置和获取

QAbstractSpinBox里面包含了一个QLineEdit控件,可以直接获取这个LineEdit对象

QAbstractSpinBox.lineEdit()

这样就可以用QLineEdit里的方法对数据进行获取或修改

QAbstractSpinBox.lineEdit().setText(‘str‘)
QAbstractSpinBox.lineEdit().text()

其实QLineEdit里的很多功能(对齐、自动填充、验证器)都可以使用

但是因为我们常常需要从控件中获取数据,QAbstractSpinBox给我们留了一个直接的API

QAbstractSpinBox.text()

可以直接获取数据。

4.对齐方式

QAbstractSpinBox.setAlignment(Qt.AlignCenter)

AlignLeft = ...  # type: ‘Qt.AlignmentFlag‘
AlignLeading = ...  # type: ‘Qt.AlignmentFlag‘
AlignRight = ...  # type: ‘Qt.AlignmentFlag‘
AlignTrailing = ...  # type: ‘Qt.AlignmentFlag‘
AlignHCenter = ...  # type: ‘Qt.AlignmentFlag‘
AlignJustify = ...  # type: ‘Qt.AlignmentFlag‘
AlignAbsolute = ...  # type: ‘Qt.AlignmentFlag‘
AlignHorizontal_Mask = ...  # type: ‘Qt.AlignmentFlag‘
AlignTop = ...  # type: ‘Qt.AlignmentFlag‘
AlignBottom = ...  # type: ‘Qt.AlignmentFlag‘
AlignVCenter = ...  # type: ‘Qt.AlignmentFlag‘
AlignVertical_Mask = ...  # type: ‘Qt.AlignmentFlag‘
AlignCenter = ...  # type: ‘Qt.AlignmentFlag‘
AlignBaseline = ...  # type: ‘Qt.AlignmentFlag‘

对齐枚举值

5.边框显示

QAbstractSpinBox控件默认有边框的

右边的图就是默认情况,带有边框,也可以不显示边框

QAbstractSpinBox.setFrame(False)

6.按钮的样式

还可以对按钮的样式进行修改

QAbstractSpinBox.setButtonSymbols(QAbstractSpinBox.NoButtons)

UpDownArrows = ... # type: ‘QAbstractSpinBox.ButtonSymbols‘
PlusMinus = ... # type: ‘QAbstractSpinBox.ButtonSymbols‘
NoButtons = ... # type: ‘QAbstractSpinBox.ButtonSymbols‘

按钮样式枚举值

枚举值中有个加减效果,但是我没试出来,不显示倒是可以的。

这里有个小技巧:如果不显示按钮,却又设置了只读模式,那么数据还能改么?可以的!在获取焦点后可以用键盘上下键来修改数据

7.内容验证

首先我们可以用QLineEdit来实现数据的验证,在这里我们讲是QAbstractSpinBox直接给出的API。

其实在一开始的案例我们就定义了一个验证器:数小于0或大于9999时再点击就没效果了,但是这仅限于用鼠标点击增减按钮。可以如果我不用鼠标,用键盘输入数据时是不调用这个方法了,那是不是就失效了!那就需要另外的方法了!但是试验是失败的,回来捋清楚了再说吧

8。信号

只有一个信号要讲

QAbstractSpinBox.editingFinished()

其实就是结束了编辑:按下Enter键、切换焦点、点击右键,关闭程序

原文地址:https://www.cnblogs.com/yinsedeyinse/p/10875067.html

时间: 2025-01-12 01:41:17

GUI学习之十四——QAbstractSpinBox学习总结的相关文章

JavaScript学习总结(十四)——JavaScript编写类的扩展方法

在?J?a?v?a?S?c?r?i?p?t?中?可以使?用?类的p?r?o?t?o?t?y?p?e属性来?扩?展?类的属?性?和?方?法,在实际开发当中,当JavaScript内置的那些类所提供的动态方法和动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中的方法和属性. 一.扩展JavaScript内置类,添加动态方法 语法格式: 类名.prototype.方法名 = function([param1],[param2],.

Swift学习笔记十四:构造(Initialization)

类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值.存储型属性的值不能处于一个未知的状态. 你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值.以下章节将详细介绍这两种方法. 注意: 当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观测器(property observers). 一.基本语法 class Human{ var name :String init(){ name = "human" } init(n

laravel3学习笔记(十四)

原作者博客:ieqi.net ==================================================================================================== 运行时配置 在 Laravel3 中很多地方我们都可以看到“约定大于配置”的影子,我本人也很喜欢这种工程哲学尤其是在框架领域,当然这并不能代替所有的配置.我们知道 Laravel3 中,主要配置都写在 application/config 文件夹下,在应用逻辑中,往往

C++语言学习(十四)——C++类成员函数调用分析

C++语言学习(十四)--C++类成员函数调用分析 一.C++成员函数 1.C++成员函数的编译 C++中的函数在编译时会根据命名空间.类.参数签名等信息进行重新命名,形成新的函数名.函数重命名的过程通过一个特殊的Name Mangling(名字编码)算法来实现.Name Mangling算法是一种可逆的算法,既可以通过现有函数名计算出新函数名,也可以通过新函数名逆向推导出原有函数名.Name Mangling算法可以确保新函数名的唯一性,只要命名空间.所属的类.参数签名等有一个不同,那么产生的

Cocos2d-x 3.1.1 学习笔记(四)学习打包Android平台APK!

从cocos2dx 3.1项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! 一.下载Android环境 搭建Android环境需要用到Android SDK.NDK.Ant和JDK: Android SDK下载http://developer.android.com/sdk/index.html Android NDk下载http://developer.android.com/tools/sdk/ndk/index.html Android JDK下

学习五十四

十四周四次课(5月14日)16.1 Tomcat介绍16.2 安装jdk16.3 安装Tomcat 扩展java容器比较 http://my.oschina.net/diedai/blog/271367 http://www.360doc.com/content/11/0618/21/16915_127901371.shtmlj2ee.j2se.ejb.javabean.serverlet.jsp之间关系 http://bbs.csdn.net/topics/50015576tomcat ser

Factorization Machines 学习笔记(四)学习算法

  最近学习了一种叫做 Factorization Machines(简称 FM)的算法,它可对任意的实值向量进行预测.其主要优点包括: 1) 可用于高度稀疏数据场景:2) 具有线性的计算复杂度.本文将对 FM 框架进行简单介绍,并对其训练算法 - 随机梯度下降(SGD)法和交替最小二乘(ALS)法进行详细推导. 相关链接: (一)预测任务 (二)模型方程 (三)回归和分类 (四)学习算法 作者: peghoty 出处: http://blog.csdn.net/itplus/article/d

我的python学习--第十四天(二)

一.ansible api 在了解python的ansible api之前,先简单了解一下ansible. ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能. ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.主要包括: 连接插件connection p

Python3.5 学习二十四

本节课程大纲: ----------------------------------------------------------------------------------------------------------- Model: -数据库操作 -验证 Form: class LoginForm(): email = fields.EmailField() -is_valid ->每一个字段进行正则(字段内置正则) + clean_字段 -> clean(__all__) -&g