QSlider滑块 QScrollBar滚动条 QProgressBar进度条 QScrollArea滚动区域深度总结

一、滑块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())

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过继承QSlider类并重写paintEvent()函数来自定义QSlider滑动条,同时可以通过设置QStyleOptionSlider中的subControls属性来设置滑块的形状为圆形。具体实现可以参考以下代码: ``` class CustomSlider : public QSlider { public: CustomSlider(QWidget *parent = nullptr) : QSlider(parent) { setStyleSheet("QSlider::groove:horizontal { height: 10px; background: #ddd; }" "QSlider::handle:horizontal { width: 20px; border-radius: 10px; background: #333; }"); } protected: void paintEvent(QPaintEvent *event) override { QSlider::paintEvent(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QStyleOptionSlider opt; initStyleOption(&opt); QRect grooveRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this); QRect handleRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); QPoint center = handleRect.center(); painter.setPen(Qt::NoPen); painter.setBrush(QColor("#333")); painter.drawEllipse(center, handleRect.width() / 2, handleRect.height() / 2); } }; ``` 在上述代码中,我们通过设置QSlider的样式表来设置滑动条的样式,其中groove表示滑动条的轨道,handle表示滑块。在paintEvent()函数中,我们首先调用QSlider的paintEvent()函数来绘制默认的滑动条,然后获取滑动条的轨道和滑块的矩形区域,并计算出滑块的中心点。最后,我们使用QPainter绘制一个圆形,将其填充为黑色,并以滑块的中心点为圆心,滑块宽度的一半为半径进行绘制,从而实现了圆形滑块的效果。 ### 回答2: QT是一款跨平台的C++图形用户界面应用程序开发框架。在QT中,我们可以自定义QSlider滑动条以及滑块的形状。 要自定义QSlider滑动条,首先我们需要创建一个自定义的滑动条类,继承QSlider。在该类中,我们可以重写一些QSlider的虚函数,如paintEvent()、sliderChange()等,以实现自定义的滑动条样式和功能。 要实现圆形的滑块,我们可以通过设置滑块样式表来实现。在QSlider的子类中,通过重写paintEvent()函数,我们可以在滑动条上绘制自定义的滑块。 以下是一个自定义的QSlider滑动条,滑块为圆形的示例代码: ```cpp class CustomSlider : public QSlider { Q_OBJECT public: CustomSlider(QWidget *parent = nullptr) : QSlider(parent) { setStyleSheet("QSlider::handle {" " background: green;" " border-radius: 8px;" " width: 16px;" " height: 16px;" "}"); } protected: void paintEvent(QPaintEvent *event) override { QSlider::paintEvent(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); QRect grooveRect = style()->subControlRect(QStyle::CC_Slider, this, QStyle::SC_SliderGroove, this); int x = grooveRect.x() + grooveRect.height() / 2 - 8; int y = grooveRect.y() + grooveRect.height() / 2 - 8; painter.setBrush(QColor(51, 153, 255)); painter.setPen(Qt::NoPen); painter.drawEllipse(QRect(x, y, 16, 16)); } }; ``` 在上述代码中,我们重写了CustomSlider的构造函数和paintEvent()函数。构造函数中通过设置样式表,将滑块的背景设为绿色,圆角半径设为8px,并设置滑块的大小为16x16px。paintEvent()函数中,我们通过获取滑动条的轨道区域,计算滑块的位置,然后绘制一个蓝色圆形作为滑块。 我们可以在应用程序中使用CustomSlider类来替代QSlider类,从而实现自定义的滑动条和圆形滑块。 ### 回答3: 要自定义QSlider滑动条,使滑块圆形,可以通过重写QStyle类的drawComplexControl方法来实现。具体步骤如下: 1. 创建一个继承自QStyle的自定义样式类,并重写drawComplexControl方法。 2. 在drawComplexControl方法中,首先调用父类的drawComplexControl方法,这样可以绘制默认样式的滑块。 3. 获取滑块的矩形区域,并将其设置为圆形。 4. 根据滑块的圆形矩形区域,绘制一个圆形。 5. 最后,将自定义样式类应用到QSlider控件上。 下面是实现上述步骤的示例代码: ```C++ #include <QtWidgets> class CustomSliderStyle : public QStyle { public: using QStyle::QStyle; void drawComplexControl(ComplexControl control, const QStyleOptionComplex* option, QPainter* painter, const QWidget* widget = nullptr) const override { if (control == CC_Slider && option->subControls == SC_SliderHandle) { QStyleOptionSlider opt = *qstyleoption_cast<const QStyleOptionSlider*>(option); // 绘制默认样式的滑块 QStyle::drawComplexControl(control, option, painter, widget); // 获取滑块的矩形区域 QRect grooveRect = subControlRect(CC_Slider, option, SC_SliderHandle, widget); QRect handleRect = opt.rect; // 将滑块的矩形区域设置为圆形 handleRect.setSize(QSize(handleRect.width(), handleRect.width())); handleRect.moveCenter(grooveRect.center()); // 绘制圆形滑块 painter->save(); painter->setRenderHint(QPainter::Antialiasing, true); painter->setPen(Qt::NoPen); painter->setBrush(opt.palette.buttonText()); painter->drawEllipse(handleRect); painter->restore(); } else { QStyle::drawComplexControl(control, option, painter, widget); } } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); QSlider slider; CustomSliderStyle customStyle; slider.setStyle(&customStyle); slider.show(); return app.exec(); } ``` 通过以上代码,可以自定义QSlider滑动条,使滑块变为圆形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值