仪表盘控件QDial
仪表盘控件 QDial与滑块控件 QSlider 类似,只不过是把滑槽由直线变成圆。仪表盘控件可以设置仪表盘上显示的刻度,最大值刻度和最小值刻度可以重合,也可以不重合。
QDial 继承自 QAbstractSlider,继承了QAbstractSlider 的方法和信号。
用QDial类创建仪表盘实例的方法如下所示其中参数parent是仪表盘控件所在的窗口或容器控件。
from PySide6.QtWidgets import QDial
QDial(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None
当用户需要将一个值控制在程序可定义的范围内,并且该范围要么环绕例如,角度从0度到359度,要么对话框布局需要一个方形小部件时,就会使用QDial。
由于QDial继承自QAbstractSlider,因此表盘的行为方式与滑块类似。当wrappeng为false默认设置时,滑块和表盘之间没有真正的区别。它们共享相同的信号、插槽和成员功能。使用哪一个取决于用户的期望和应用程序的类型。
当滑块移动时,表盘最初会连续发出valueChanged信号;您可以通过禁用跟踪属性来减少它发出信号的频率。即使禁用了跟踪,sliderMoved信号也会连续发出。
当按下和释放鼠标按钮时,表盘还会发出sliderPressed和sliderReleased信号。请注意,由于键盘和滚轮也可以用于更改数值,因此表盘的数值可以在不发出这些信号的情况下更改。
与滑块不同,QDial尝试绘制"不错"数量的凹口,而不是每行一步。如果可能的话,每行步绘制一个凹口,但如果没有足够的像素来绘制每个凹口,QDial将跳过凹口,尝试绘制统一的集合例如,每隔第二个或第三个凹口绘制一个。
与滑块一样,刻度盘使QAbstractSlider函数setValue可用作插槽。
表盘的键盘界面相当简单:左/上/右/下箭头键通过定义的singleStep调整表盘的值,Page up和Page down通过定义的pageStep调整,Home和End键将值设置为定义的最小值和最大值。
如果使用鼠标滚轮调整刻度盘,则增量值由滚轮滚动线乘以singleStep和pageStep的较小值确定。
仪表盘控件QDial的属性
属性 | 描述 | 功能访问 |
---|---|---|
notchSize: int | 此属性保持当前缺口大小。 陷波大小以范围控制为单位,而不是像素,并且计算为singleStep的倍数,这会导致屏幕上的陷波大小接近notchTarget。 | notchSize () |
notchTarget: float | 此属性保持凹口之间的目标像素数。 陷波目标是QDial试图在每个陷波之间放置的像素数。 实际大小可能与目标大小不同。 默认的陷波目标是3.7像素。 | notchTarget () setNotchTarget (target) |
notchesVisible: bool | 此属性保留是否显示凹口。 如果属性为真,则在表盘周围绘制一系列凹口,以指示可用值的范围;否则没有示出凹口。 默认情况下,此属性处于禁用状态。 | notchesVisible () setNotchesVisible (visible) |
wrapping: bool | 此属性保留是否启用环绕。 如果为true,则启用包装;否则,在表盘底部插入一些空格,以分隔有效值范围的两端。 如果启用,箭头可以在表盘上以任何角度定向。如果禁用,箭头将限制在表盘的上部;如果它被旋转到表盘底部的空间中,它将被夹在有效值范围的最近端。 默认情况下,此属性为false。 | wrapping () setWrapping (on) |
仪表盘控件QDial的常用方法
仪表盘控件QDial的常用方法如表所示。
- 用setnotchesVisible(visible:bool)方法设置刻度是否可见,
- 用setnotchTarget(target: float)方法设置刻度之间的像素距离,
- 用setWrapping(on:bool)方法设置最大值刻度和最小值刻度是否重合,
- 用setRange(min:int,max;int)方法设置最小值刻度和最大值刻度所代表的值
- 用setValue(int)方法设置滑块当前指向的值,
- 用value()方法获取滑块的值。
QDial的方法及参数类型 | 返回值的类型 | 说 明 |
---|---|---|
[slot]setnotchesVisible(visible:bool) | None | 设置刻度是否可见 |
notchesVisible() | bool | 获取刻度是否可见 |
setnotchTarget(target:float) | None | 设置刻度之间的距离(像素) |
notchTarget() | float | 获取刻度之间的距离 |
[slot]setWrapping(on: bool) | None | 设置最大刻度和最小刻度是否重合 |
wrapping() | bool | 获取最大值和最小值刻度是否重合 |
notchSize() | int | 获取相邻刻度之间的值 |
setRange(min: int,max: int) | None | 设置刻度代表的最小值和最大值 |
setMaximum(int) | None | 设置刻度代表的最大值 |
setMinimum(int) | None | 设置刻度代表的最小值 |
setInvertedAppcarance(bool) | None | 设置刻度反向 |
[slot]setValue(int) | None | 设置滑块当前所在的位置 |
value() | int | 获取滑块的值 |
setPageStep(int) | None | 设置按PgUp键和PgDn键时滑块移动的 距离 |
setSingleStep(int) | None | 设置按上下左右箭头键时滑块移动的距离 |
setTracking(enable: bool) | None | 设置移动滑块时是否连续发送 valueChanged(int)信号 |
QDial控件的信号
QDial控件的信号与 QSlider 控件的信号相同
滚动条控件QScrollBar 和滑块控件 QSlider 的信号如表所示
-
最常用的信号是valueChanged(value:int)
-
actionTriggered(action:int)信号在用户用鼠标或键盘键改变滑块位置时发送,根据改变方式的不同,信号的参数值也不同action 的值可以取以下值,对应的值分别是0~7,例如
- 单击两端的箭头改变滑块位置,参数的值是1或2
- 如果单击滑块的轨道改变滑块位置,参数的值是3或4
- 如果拖动滑块参数的值是 7
值 QAbstractSlider.SliderNoAction QAbstractSlider.SliderSingleStepAdd QAbstractSlider.SliderSingleStepSub QAbstractSlider.SliderPageStepAdd QAbstractSlider.SliderPageStepSub AbstractSlider.SliderToMinimum QAbstractSlider.SliderToMaximum QAbstractSlider.SliderMove
QScrollBar和QSlider的信号及参数类型 | 说 明 |
---|---|
valueChanged(value:int) | 当值发生变化时发送信号 |
rangeChanged(min:int,max: int) | 当最小值和最大值发生变化时发送信号 |
sliderMoved(value:int) | 当滑块移动时发送信号 |
sliderPressed() | 当按下滑块时发送信号 |
sliderReleased() | 当释放滑块时发送信号 |
actionTriggered(action:int) | 当用鼠标改变滑块位置时发送信号,参数 action根据改 变方式的不同也会不同 |
QDial 例子
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/15 0:48
# File_name: 03-QDial 例子.py
import sys
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
class dialDemo(QWidget):
def __init__(self,parent=None):
super(dialDemo,self).__init__(parent)
self.setWindowTitle("QDial 例子")
self.resize(600,600)
layout = QVBoxLayout()
self.label = QLabel("Hello Qt for Python")
self.label.setAlignment(Qt.AlignCenter)
layout.addWidget(self.label)
# 普通qdial
self.dial1 = QDial()
self.dial1.setMinimum(10)
self.dial1.setMaximum(50)
self.dial1.setSingleStep(3)
self.dial1.setPageStep(5)
self.dial1.setValue(20)
layout.addWidget(self.dial1)
# 开启循环
self.dial_wrap = QDial()
self.dial_wrap.setMinimum(5)
self.dial_wrap.setMaximum(25)
self.dial_wrap.setSingleStep(1)
self.dial_wrap.setPageStep(5)
self.dial_wrap.setValue(15)
self.dial_wrap.setWrapping(True)
self.dial_wrap.setMinimumHeight(100)
layout.addWidget(self.dial_wrap)
# 连接信号槽
self.dial1.valueChanged.connect(lambda: self.valuechange(self.dial1))
self.dial_wrap.valueChanged.connect(lambda: self.valuechange(self.dial_wrap))
self.setLayout(layout)
def valuechange(self,dial):
size = dial.value()
self.label.setText('选中大小:%d'% size)
self.label.setFont(QFont("Arial",size))
if __name__ =='__main__':
app = QApplication(sys.argv)
app.setWheelScrollLines(2)
demo = dialDemo()
demo.show()
sys.exit(app.exec())