GUI编程--PyQt5--QAbstractSlider

QAbstractSlider

抽象的基类,必须子类化,

QSlider

滑块案例

  1. 滑块移动时,标签展示滑块的当前值
  2. 标签位置一直在滑块位置的中间,并随之移动
  3. 点击滑块,则显示值,释放鼠标则不显示
# __author__ = "laufing"
# class_based_qt
# laufing_qt

# __author__ = "laufing"

from PyQt5.QtGui import QIcon, QPixmap, QCursor, QKeyEvent
from PyQt5 import QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget,QSlider, QApplication, QLabel, QDesktopWidget, QPushButton
import sys


class MySlider(QSlider):
    def __init__(self, *args, **kwargs):
        super(MySlider, self).__init__(*args, **kwargs)
        self.set_label()

    def set_label(self):
        self.label = QLabel()
        self.label.setStyleSheet("color: red;")
        self.label.setText("0")

    # 鼠标按下时
    def mousePressEvent(self, ev: QtGui.QMouseEvent):
        super(MySlider, self).mousePressEvent(ev)

        print("鼠标按下", ev.pos())

        # 移动label的位置
        self.label.setText(str(self.value()))
        self.label.adjustSize()
        x = self.width() // 2 - self.label.width() // 2
        y = ev.y() - self.label.height() // 2
        self.label.move(x, y)
        self.label.setParent(self)
        self.label.show()

    # 鼠标移动时
    def mouseMoveEvent(self, ev: QtGui.QMouseEvent):
        super(MySlider, self).mouseMoveEvent(ev)

        print("鼠标移动", ev.y())


        # 鼠标移动时,标签值随着移动
        self.label.setText(str(self.value()))
        self.label.adjustSize() # 动态大小
        if 0 + self.label.height()//2 <= ev.y() <= 200 - self.label.height()//2:
            # 移动label
            x = self.width()//2 - self.label.width()//2
            y = ev.y() - self.label.height()//2
            self.label.move(x, y)

    def mouseReleaseEvent(self, ev: QtGui.QMouseEvent):
        super(MySlider, self).mouseReleaseEvent(ev)

        print("鼠标释放")
        self.label.hide()


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        # 窗口标题
        self.setWindowTitle("laufing[*]")
        # 窗口图标
        pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)
        icon = QIcon(pixmap)
        # icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)

        # 设置宽高
        self.resize(500, 600)

        # 窗口居中
        desktop_geo = QDesktopWidget().geometry()
        width, height = desktop_geo.width(), desktop_geo.height()
        self.move(width / 2 - self.width() / 2, height / 2 - self.height() / 2)


        # 设置文本
        # self.label = QLabel(self)
        # self.label.setText("0")
        # self.label.setStyleSheet("color: red;")
        # self.label.move(220, 350)
        self.set_ui()

    def set_ui(self):
        slider = MySlider(self)
        slider.resize(50, 200)
        # 绝对定位
        slider.move(200, 200)
        # 设置刻度
        slider.setTickPosition(QSlider.TickPosition.TicksBothSides)
        slider.setTickInterval(5)
        # 最小值
        slider.setMinimum(0)
        # 最大值
        slider.setMaximum(100)
        # 步长
        slider.setSingleStep(5)
        # slider.setPageStep(10)

        # 信号
        self.slider = slider
        slider.valueChanged.connect(self.showValue)
        # slider.sliderMoved.connect(self.moved)  # 也是传入的值
        # slider.sliderPressed.connect()
        # slider.sliderReleased.connect()

    def showValue(self, val):
       print("值改变了:", val)


if __name__ == '__main__':
    import time
    # 窗口应用程序
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    status_code = app.exec_()
    sys.exit(status_code)

 
 

QScrollBar 滚动条

如下,a为滚动条,c为滚动区域(如0-100),pageStep=50,两步则滚动结束。
在这里插入图片描述

在这里插入图片描述

def set_ui(self):
    # 默认垂直方向的
    sb = QScrollBar(self)
    sb.resize(30, 100)
    sb.move(200, 200)

    # 水平方向的滚动条
    sb2 = QScrollBar(Qt.Orientation.Horizontal, self)
    sb2.resize(100, 30)
    sb2.move(200, 300)
	# 获取键盘输入
	sb.grabKeyboard()

QDial

圆形刻度盘,选择刻度值,继承QAbstractSlider。

dl = QDial(self)  # 圆形刻度盘
dl.resize(100, 100)
dl.move(200, 300)

# 信号
dl.sliderPressed.connect(lambda : print("滑块按下..."))
dl.sliderMoved.connect(lambda : print("滑块移动"))
dl.sliderReleased.connect(lambda : print("滑块释放..."))
dl.valueChanged.connect(lambda val: print("当前值:", val))

# 值范围
dl.setMaximum(0)
dl.setMaximum(100)
# dl.setRange(0, 100)

# 显示刻度 可见
dl.setNotchesVisible(True)
# 大刻度控制
dl.setPageStep(5)
# 设置包裹  周边均设置刻度,循环转动(默认不能循环转动)
dl.setWrapping(False)

# 刻度之间的像素值
dl.setNotchTarget(20)
print("获取刻度之间的像素值:", dl.notchSize())

 
 

QRubberBand

橡皮筋控件,实现鼠标选区,结合鼠标事件实现。
在这里插入图片描述

# 实例化橡皮筋控件
rb = QRubberBand(QRubberBand.Shape.Rectangle, self)
# 设置尺寸
rb.setGeometry(x, y, width, height)
rb.setGeometry(QRect)

rb.setGeometry(0,0, 200, 200)
rb.move(200, 200)

# 不可直接显示, 需结合鼠标事件

实现如下案例:
在这里插入图片描述


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        # 窗口标题
        self.setWindowTitle("laufing[*]")
        # 窗口图标
        pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)
        icon = QIcon(pixmap)
        # icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)

        # 设置宽高
        self.resize(500, 600)

        # 窗口居中
        desktop_geo = QDesktopWidget().geometry()
        width, height = desktop_geo.width(), desktop_geo.height()


        self.move(width / 2 - self.width() / 2, height / 2 - self.height() / 2)

        # 显示界面
        self.set_ui()
        # 展示登录页面
        self.login(False)

    def set_ui(self):
        # 展示多个复选框
        for i in range(30):
            cb = QCheckBox(self)
            cb.setText(str(i))
            cb.move(i%4 * 50, i//4 * 60)

        # 初始化一个橡皮筋控件
        self.rb = QRubberBand(QRubberBand.Shape.Rectangle, self)

    # 重写 鼠标事件函数
    def mousePressEvent(self, a0: QtGui.QMouseEvent):
        super(Window, self).mousePressEvent(a0)
        print("鼠标按下....")
        #  设置尺寸,并展示
        self.origin_pos = a0.pos()
        self.rb.setGeometry(QRect(self.origin_pos, QSize()))  # QSize 不传值就是宽高为0
        # 展示
        self.rb.show()

    # 鼠标移动事件
    def mouseMoveEvent(self, a0: QtGui.QMouseEvent):
        super(Window, self).mouseMoveEvent(a0)
        print("鼠标移动了...")
        # 鼠标移动时,重新设置尺寸
        # QRect(x, y, width, height)
        self.rb.setGeometry(QRect(self.origin_pos, a0.pos()).normalized())  # normalized解决反向选取

    # 鼠标释放事件
    def mouseReleaseEvent(self, a0: QtGui.QMouseEvent):
        # 令选中的复选框  切换状态
        # 选中的区域
        selected_area = self.rb.geometry()

        #
        for child in self.findChildren(QCheckBox):
            #  选中的区域是否包含 子控件区域
            if selected_area.contains(child.geometry()):  # child.inherits("QCheckBox")
                # 包含 ,则切换状态
                child.toggle()

        # 隐藏橡皮筋控件
        self.rb.hide()

 

展示登录页面

# __author__ = "laufing"
# class_based_qt
# laufing_qt

# __author__ = "laufing"

from PyQt5.QtGui import QIcon, QPixmap, QCursor, QKeyEvent
from PyQt5 import QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QRect, QSize, QPoint
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QFrame, QLineEdit, QTextEdit, QSlider, QRubberBand, QDial, QDialog, QDateTimeEdit, QRubberBand, QDial, QScrollBar, QApplication, QLabel, QDesktopWidget, QPushButton
from PyQt5.QtCore import pyqtSignal
import sys


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        # 窗口标题
        self.setWindowTitle("laufing[*]")
        # 窗口图标
        pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)
        icon = QIcon(pixmap)
        # icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)

        # 设置宽高
        self.resize(500, 600)

        # 窗口居中
        desktop_geo = QDesktopWidget().geometry()
        width, height = desktop_geo.width(), desktop_geo.height()


        self.move(width / 2 - self.width() / 2, height / 2 - self.height() / 2)

        # 显示界面
        self.set_ui()
        # 展示登录页面
        self.login(True)

    def set_ui(self):
        # 实例化橡皮筋控件
        rb = QRubberBand(QRubberBand.Shape.Rectangle, self)
        rb.setGeometry(QRect(QPoint(0, 0), QSize(200, 200)))
        rb.move(200, 200)

    # 登录页面
    def login(self, show=True):
        # 边框
        self.login = QFrame()
        # 设置边框样式
        self.login.setFrameStyle(QFrame.Shape.Box | QFrame.Shadow.Sunken)
        self.login.resize(400, 500)  # 注意与父窗口的大小
        # 输入用户名
        self.login.hb = QHBoxLayout()
        self.login.username = QLabel("用户名:")
        self.login.username.adjustSize()
        self.login.username_le = QLineEdit()
        self.login.username_le.setPlaceholderText("输入用户名")
        self.login.username_le.resize(200, 50)

        self.login.hb.addWidget(self.login.username)
        self.login.hb.addWidget(self.login.username_le)

        # 用户密码 水平盒子
        self.login.hb2 = QHBoxLayout()
        # 密码等控件
        self.login.password = QLabel("密码:")
        self.login.password.adjustSize()
        self.login.password_le = QLineEdit()
        self.login.password_le.setPlaceholderText("输入密码")
        self.login.password_le.resize(200, 50)
        # 将密码等控件 放入水平盒子
        self.login.hb2.addWidget(self.login.password)
        self.login.hb2.addWidget(self.login.password_le)


        # 登录的按钮
        self.login.btn = QPushButton("登录")
        self.login.btn.resize(200, 200)
        self.login.btn.setStyleSheet("QPushButton{ color: blue; border: 3px dashed pink; border-radius: 20px;}")

        # 垂直盒子
        self.login.vb = QVBoxLayout()
        self.login.vb.addLayout(self.login.hb)  # 添加水平盒子
        self.login.vb.addLayout(self.login.hb2)
        self.login.vb.addWidget(self.login.btn)  # 添加控件

        self.login.setLayout(self.login.vb)
        # self.login.password = QLabel("密码:", self.login)

        # 登录页面的展示
        if show:
            self.login.setParent(self)
            self.login.setStyleSheet("background-color: lightblue;")
            # print("xxxx:", self.login.width())
            # 登录页面的居中布局
            self.login.move(self.width()//2 - self.login.width()//2, self.height()//2 - self.login.height()//2)
            self.login.show()

        else:
            self.login.hide()




if __name__ == '__main__':
    import time
    # 窗口应用程序
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    status_code = app.exec_()
    sys.exit(status_code)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值