一、滑块QSlider
(一)滑块的作用
(二)方法和属性
1.创建滑块
slider=QSlider()
2.属性和方法
(1)设置滑块最大值和最小值
slider.setMinimum()
slider.setMaximum()
(2)设置滑块的取值区间范围
slider.setRange()
# 比如:
slider.setRange(0,255)
# 滚动条的最小值为0,最大值为255
(3)设置滑块显示方向
slider.setOrientation()
取值如下:
Qt.Horizontal:水平滚动条
Qt.Vertical:垂直滚动条
slider.setOrientation(Qt.Horizontal) # 设置水平滚动条
slider.setOrientation(Qt.Vertical) # 设置垂直滚动条
(4)获取滚动条的值
slider.value()
(5)设置滑块条的值
slider.setValue()
(6)设置滑块的步长
slider.setSingleStep(3)
(7)设置滑块的刻度位置
slider.setTickPosition(QSlider.TicksRight)
# QSlider.NoTicks 不设置刻度线
# QSlider.TicksBothSides 两边都设置刻度线
# QSlider.TicksAbove 在水平滑动条上方设置刻度线
# QSlider.TicksBelow 在水平滑动条下方设置刻度线
# QSlider.TicksLeft 在垂直滑动条左方设置刻度线
# QSlider.TicksRight 在垂直滑动条右方设置刻度线
(8)设置滑块的刻度间隔
slider.setTickInterval(6)
(9)获取滑块刻度线间隔数值
slider.tickInterval()
(10)获取滑块刻度位置,结果是数值
由此可以断定,设置滑块刻度位置的参数可以用数值表示,有时间可以尝试一下。
slider.tickPosition()
(11)获取滑块的步长
slider.singleStep()
(12)获取滑块的方向,结果是数值
由此可以断定,设置滑块方向的参数可以用数值表示,有时间可以尝试一下。
slider.orientation()
3.常用信号
1.滑块数值改变
slider.valueChanged.connect()
(三)示例代码
1.课堂练习代码
学习资料来源:课时41.滑块控件_哔哩哔哩_bilibili
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.resize(600,500)
self.setUI()
def setUI(self):
MainLay=QVBoxLayout()
self.setLayout(MainLay)
self.slider=QSlider()
# 设置方向
self.slider.setOrientation(Qt.Horizontal)
# 设置最小值
self.slider.setMinimum(12)
# 设置最大值
self.slider.setMaximum(48)
# 设置步长
self.slider.setSingleStep(3)
# 设置当前值
self.slider.setValue(18)
# 设置刻度位置
self.slider.setTickPosition(QSlider.TicksRight)
# 设置刻度间隔
self.slider.setTickInterval(6)
MainLay.addWidget(self.slider)
self.slider.valueChanged.connect(self.ValueChange)
self.lable=QLabel('你好,PyQt5!')
MainLay.addWidget(self.lable)
def ValueChange(self):
print(f'{self.slider.value()}')
self.lable.setFont(QFont('黑体',self.slider.value()))
if __name__ == "__main__":
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec()
Python高级进阶教程015期 pyqt5进度条QProgressBar应用_哔哩哔哩_bilibili
二、滚动条QScrollBar
(一)滚动条的作用
1.通过滚动条值的变化控制其他控件状态的变化(老师有代码示例)
2.通过滚动条值的变化控制控件位置的变化(老师有代码示例)
以上笔记内容来源:课时86.滚动条控件(QScrollBar)_哔哩哔哩_bilibili
(二)方法和属性
1.创建滚动条
scrollBar1=QScrollBar()
2.属性和方法
(1)设置滚动条最大值和最小值
scrollBar1.setMinimum()
scrollBar1.setMaximum()
(2)设置滚动条的取值区间范围
相当于一次性设置了最小值和最大值
scrollBar1.setRange()
# 比如:
scrollBar1.setRange(0,255)
# 滚动条的最小值为0,最大值为255
(3)设置滚动条显示方向
scrollBar1.setOrientation()
取值如下:
Qt.Horizontal:水平滚动条
Qt.Vertical:垂直滚动条
scrollBar1.setOrientation(Qt.Horizontal) # 设置水平滚动条
scrollBar1.setOrientation(Qt.Vertical) # 设置垂直滚动条
(4)获取滚动条的值
scrollBar1.value()
(5)设置滚动条的值
scrollBar1.setValue()
3.常用信号
(1)拖动滚动条的滑块时发射信号
scrollBar1.sliderMoved
(2)滚动条的值发生改变时发射信号
scrollBar1.valueChanged
(三)示例代码
1.自己学习时写的代码
'''
QScrollBar的作用
1.通过滚动条值的变化控制其他控件状态的变化
2.通过滚动条值的变化控制控件位置的变化
老师的其他操作:通过移动滚动条,变化QLabel的位置
'''
from PyQt5.QtWidgets import *
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.resize(600,500)
self.setUI()
def setUI(self):
MainLay=QHBoxLayout()
self.setLayout(MainLay)
Label1=QLabel('拖动滚动条改变文字颜色')
MainLay.addWidget(Label1)
self.scrollBar1=QScrollBar()
MainLay.addWidget(self.scrollBar1)
self.scrollBar1.setMaximum(255)
self.scrollBar1.sliderMoved.connect(self.getScrollBarValue)
self.scrollBar2=QScrollBar()
MainLay.addWidget(self.scrollBar2)
self.scrollBar2.setMaximum(255)
self.scrollBar2.sliderMoved.connect(self.getScrollBarValue)
self.scrollBar3=QScrollBar()
MainLay.addWidget(self.scrollBar3)
self.scrollBar3.setMaximum(255)
self.scrollBar3.sliderMoved.connect(self.getScrollBarValue)
def getScrollBarValue(self):
print(self.scrollBar1.value(),self.scrollBar2.value(),self.scrollBar3.value())
if __name__ == "__main__":
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec()
三、进度条QProgressBar
(一)进度条的作用
(二)方法和属性
1.创建进度条
progressBar=QProgressBar()
2.属性和方法
(1)设置进度条的最小值和最大值
progressBar.setMinimum()
progressBar.setMaximum()
(2)设置进度条的取值范围(最小值和最大值)
progressBar.setRange()
(3)设置进度条方向(水平: Qt.Horizontal, 垂直: Qt.Vertical)
progressBar.setOrientation(): 设置进度条方向(水平: Qt.Horizontal, 垂直: Qt.Vertical)
(4)获取进度条的值
progressBar.value()
(5)设置进度条的值
progressBar.setValue()
(6)设置文本字体
progressBar.setFont()
(7)设置进度条的文本是否可见
progressBar.setTextVisible()
(8)设置文本方向,只对垂直进度条有效
progressBar.setOrientation(): 设置进度条方向(水平: Qt.Horizontal, 垂直: Qt.Vertical)
(9)设置文本字符串的格式(%p, 百分比显示,这是默认情况, %v: 当前进度, %m :总步数)
progressBar.setFormat(): 设置文本字符串的格式(%p, 百分比显示,这是默认情况, %v: 当前进度, %m :总步数)
(10)设置进度条的方向(True/False: 正反方向)
progressBar.setInvertedAppearance()
(11)让进度条重新回到开始位置
progressBar.reset(): 让进度条重新回到开始位置
(12)隐藏进度条,进度达到百分之百时,可以通过设置隐藏对话框的方法来关掉进度条窗口
progressBar.hide()
3.信号
(三)示例代码
1.学习笔记代码
来源:Python高级进阶教程015期 pyqt5进度条QProgressBar应用_哔哩哔哩_bilibili
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.resize(600,500)
self.setUI()
def setUI(self):
MainLay=QVBoxLayout()
self.setLayout(MainLay)
self.progressBar=QProgressBar()
self.progressBar.setMinimum(0)
self.progressBar.setMaximum(100)
self.pv=0
self.timer=QBasicTimer()
self.progressBar.setValue(self.pv)
MainLay.addWidget(self.progressBar)
self.pushButton=QPushButton('开始')
self.pushButton.setFixedSize(60,30)
self.pushButton.clicked.connect(self.MyFunc)
MainLay.addWidget(self.pushButton)
def MyFunc(self):
if self.timer.isActive():
self.timer.stop()
self.pushButton.setText('开始')
else:
self.timer.start(100,self)
self.pushButton.setText('停止')
def timerEvent(self, e):
if self.pv==100:
self.timer.stop()
self.pushButton.setText('完成')
else:
self.pv=self.pv+1
self.progressBar.setValue(self.pv)
if __name__ == "__main__":
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec()
四、滚动区域QScrollArea
(一)滚动区域的作用
在GUI应用中,常常会遇到这样的问题,比如显示一幅大的图像,但显示区域有限,不能完整地显示整个图像,或者能展示界面的区域有限,但是界面中需要展现的控件、内容却很多,在限定的区域内无法全部展示。这个时候我们就需要区域是可以水平和(或)垂直方向可以滚动,以实现对整个图像或者所有控件的浏览。在PyQt中,提供滚动区控件QScrollArea来实现这个功能。
(二)方法和属性
1.创建滚动区域
scrollArea = QScrollArea()
2.方法
(1)设置控件为QScrollArea的子控件
scrollArea.setWidget()
(2)删除QScrollArea的子控件
scrollArea.takeWidget()
(3)返回QScrollArea的子控件
scrollArea.widget()
(4)设置为true,则滚动区域部件将自动调整,以避免可以不显示的滚动条,或者利用额外的空间;
scrollArea.setWidgetResizable()
(5)获得区域里的控件是否自动可调的设置;
scrollArea.widgetResizable()
(6)设置滚动条的值
scrollArea.verticalScrollBar().setValue() # 设置垂直滚动条的值
scrollArea.horizontalScrollBar().setValue() # 设置水平滚动条的值
(7)设置滚动条的策略
scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) # 设置垂直滚动条是否显示
scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) # 设置水平滚动条是否显示
参数值的含义:
Qt.ScrollBarAsNeeded:仅在需要时显示滚动条。
Qt.ScrollBarAlwaysOff:从不显示滚动条。
Qt.ScrollBarAlwaysOn:始终显示滚动条。
(8)确保指定的控件widget可见,必要时滚动;操作不理想,见代码综合各种资料的学习代码内容
scrollArea.ensureWidgetVisible()
(9)确保一定区域可见,必要时滚动(没有查到四个参数的准确含义,待研究)
scrollArea.ensureVisible()
3.信号
无
(三)示例代码
1.综合各种资料的自己写学习代码,以下是学习资料:
https://blog.csdn.net/yongzhouchen/article/details/136324693
https://blog.csdn.net/seniorwizard/article/details/109839047
import sys, os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap, QPalette
from PyQt5.QtCore import Qt
'''
https://blog.csdn.net/yongzhouchen/article/details/136324693
https://blog.csdn.net/seniorwizard/article/details/109839047
'''
class DemoScrollArea(QWidget):
def __init__(self, parent=None):
super(DemoScrollArea, self).__init__(parent)
# 设置窗口标题
self.setWindowTitle('实战PyQt5: QScrollArea Demo!')
# 设置窗口大小
self.resize(480, 360)
self.initUi()
def initUi(self):
MainLayout = QVBoxLayout()
self.setLayout(MainLayout)
self.scrollArea = QScrollArea()
MainLayout.addWidget(self.scrollArea)
self.scrollArea.setBackgroundRole(QPalette.Dark)
MainLayout.addWidget(self.scrollArea)
HLay1=QHBoxLayout()
HLay2 = QHBoxLayout()
HLay3 = QHBoxLayout()
MainLayout.addLayout(HLay1)
MainLayout.addLayout(HLay2)
MainLayout.addLayout(HLay3)
bt0 = QPushButton('添加QScrollArea的子控件')
bt0.clicked.connect(self.O)
bt1 = QPushButton('删除QScrollArea的子控件')
bt1.clicked.connect(self.A)
bt2 = QPushButton('返回QScrollArea的子控件')
bt2.clicked.connect(self.B)
bt3 = QPushButton('滚动区域部件自动调整')
bt3.clicked.connect(self.C)
bt4 = QPushButton('区域里的控件是否自动可调的设置')
bt4.clicked.connect(self.D)
bt5 = QPushButton('确保一定区域可见,必要时滚动')
bt5.clicked.connect(self.E)
bt6 = QPushButton('确保指定的控件widget可见,必要时滚动')
bt6.clicked.connect(self.F)
bt7 = QPushButton('设置滚动条的值')
bt7.clicked.connect(self.setBarValue)
bt8 = QPushButton('设置滚动条的策略')
bt8.clicked.connect(self.G)
HLay1.addWidget(bt0)
HLay1.addWidget(bt1)
HLay1.addWidget(bt2)
HLay2.addWidget(bt3)
HLay2.addWidget(bt4)
HLay2.addWidget(bt5)
HLay3.addWidget(bt6)
HLay3.addWidget(bt7)
HLay3.addWidget(bt8)
def O(self): # 通过
self.lalbe1 = QLabel(self)
self.lalbe1.resize(800,800)
self.pixmap=QPixmap('狼.jpeg')
self.lalbe1.setPixmap(self.pixmap)
self.scrollArea.setWidget(self.lalbe1)
def A(self): # 通过
self.scrollArea.takeWidget()
def B(self): # 通过
w=self.scrollArea.widget()
print(w)
def C(self): #设置滚动区域的控件尺寸自动调整至内容大小
print(f'图片尺寸:{self.pixmap.size()}')
print(f'lable调整前尺寸:{self.lalbe1.size()}')
self.scrollArea.setWidgetResizable(True)
print(f'lable调整后尺寸:{self.lalbe1.size()}')
def D(self): # 获取上一个函数的值
x=self.scrollArea.widgetResizable()
print(x)
def E(self):
# self.scrollArea.resize(600,800)
print(self.scrollArea.size())
print(f'图片尺寸:{self.pixmap.size()}')
self.scrollArea.ensureVisible(890,500,0,0) # 个人感觉,890相当于将水平滚动条的值设置为890,垂直滚动条的值设置为500
'''
Margin 页边空白
'''
def F(self):
self.scrollArea.setWidgetResizable(True)
widget = QWidget()
layout = QVBoxLayout()
widget.setLayout(layout)
bt_list = [QPushButton(f'Button {i}') for i in range(10000)]
# print(bt_list)
for bt in bt_list:
# print(bt.text())
layout.addWidget(bt)
self.scrollArea.setWidget(widget)
b1=bt_list[-6]
print(b1.text())
self.scrollArea.ensureWidgetVisible(b1)
'''
ScrollArea.ensureWidgetVisible() 是一个在 PyQt5 中的方法,它用于确保一个小部件在 ScrollArea 中是可见的。
如果小部件不在视图中,它会滚动 ScrollArea 使得小部件可见。
'''
def setBarValue(self):
self.scrollArea.verticalScrollBar().setValue(890)
self.scrollArea.horizontalScrollBar().setValue(500)
def G(self):
self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
'''
设置滚动策略
scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)垂直滚动条策略
scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)水平滚动条策略
Qt.ScrollBarAsNeeded:仅在需要时显示滚动条。
Qt.ScrollBarAlwaysOff:从不显示滚动条。
Qt.ScrollBarAlwaysOn:始终显示滚动条。
ensureVisible 方法的参数主要有以下几种:
widget:要确保可见的子控件。
xmargin(可选):水平方向的边距。
ymargin(可选):垂直方向的边距。
'''
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoScrollArea()
window.show()
sys.exit(app.exec())