PyQt5 GUI编程(组件使用)

pyqt5,gui · 浏览次数 : 0

小编点评

**代码摘要:** 该代码创建一个包含三个按钮和一个日历的窗口。每个按钮对应不同的颜色,通过设置其背景颜色来实现效果。通过使用 `QCheckBox` 和 `QSlider` 等组件,用户可以选择颜色。当用户点击“ Red”、“Green”或“Blue”按钮时,会触发 `setColor` 函数,该函数根据按钮的文本设置相应的背景颜色。 **主要代码功能:** 1. **按钮点击事件:** 当用户点击按钮时,会发送一个信号,并调用 `setColor` 函数以设置背景颜色。 2. **颜色选择:** 使用 `QCheckBox` 创建复选框,用户可以选择不同的颜色。 3. **滑块组件:** 使用 `QSlider` 创建水平和垂直滑动条,用户可以设置背景颜色。 4. **日志记录:** 在窗口标题中添加当前日期。 5. **下拉框:** 创建一个下拉框,用户可以选择不同的颜色。 **代码结构:** 1. **初始化函数 `initUI`:** 在窗口初始化时设置组件的属性,并注册信号处理程序。 2. **`slider` 函数:** 用于处理水平滑块的滑动事件,并根据滑动位置更新 label 的文本。 3. **`setColor` 函数:** 用于设置背景颜色。 4. **`onActivated` 函数:** 处理下拉框的激活事件,并更新 label 的文本。 5. **`showDate` 函数:** 用于设置日历的日期文本。

正文

一.简介

PyQt5 是一个用于创建图形用户界面(GUI)应用程序的 Python 绑定,它基于 Qt 库。PyQt5 提供了大量的组件(也称为控件或部件),用于构建复杂的用户界面。以下是一些常用的 PyQt5 组件

二.组件用法

1.数字组件(QLCDNumber)

class FileChooserApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        lcd = QLCDNumber()  # 创建一个数字控件
        sld = QSlider(Qt.Horizontal)  # 创建一个进度条控件
        vbox = QVBoxLayout()  # 创建一个垂直布局
        vbox.addWidget(lcd)
        # vbox.addStretch(1)
        vbox.addWidget(sld)

        self.setLayout(vbox)  # 添加到布局器中
        sld.valueChanged.connect(lcd.display)  # 将数字和进度条联动绑定在一起

        self.setWindowTitle('文件选择器')
        self.setGeometry(300, 300, 500, 500)

上述中创建了一个数字组件和一个进度条组件,两者绑定在一起,通过滑动进度条来改变数字。

2.快捷键(Key_Space)

    def keyPressEvent(self, e):  # 重写keyPressEvent
        if e.key() == Qt.Key_Space:  # 如果按下空格键退出程序,Qt.Key_Escape也可写成具体的数字32
            print("事件")
            self.close()

除了Qt.Key_Space外还有上千种快捷操作,可以在封装好的Qt.py下查看,这里列举几个最常用的。

Qt.Key_Return 或 Qt.Key_Enter 代表回车键
Qt.Key_Space 代表空格键
Qt.Key_A 到 Qt.Key_Z 代表 A 到 Z 的字母键
Qt.Key_0 到 Qt.Key_9 代表 0 到 9 的数字键
Qt.Key_F1 到 Qt.Key_F12 代表功能键 F1 到 F12
Qt.Key_Tab 代表 Tab 键
Qt.Key_Backspace 代表退格键(Backspace)
Qt.Key_Delete 代表删除键
Qt.Key_Home和 Qt.Key_End 代表 Home 和 End 键
Qt.Key_Left, Qt.Key_Right, Qt.Key_Up, Qt.Key_Down 代表方向键
Qt.Key_Plus 和 Qt.Key_Minus 代表加号(+)和减号(-)键(注意,这些与数字键盘上的加减号不同)
Qt.Key_PageUp 和 Qt.Key_PageDown 代表翻页键

3.鼠标位置跟踪

class FileChooserApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        x = 0
        y = 0

        text = "x: {0},y: {1}".format(x, y)  # 设置默认值0,0
        self.label = QLabel(text, self)  # 坐标添加到laber组件里
        self.label.resize(150, 20)  # 设置组件长宽
        self.setMouseTracking(True)  # x,y显示在laber组件里
        self.setGeometry(300, 300, 350, 200)
        self.setWindowTitle('鼠标坐标')

    # 鼠标位置跟踪
    def mouseMoveEvent(self, e):  # e表示当前鼠标对象,x(),y()得到鼠标x,y坐标
        x = e.x()
        y = e.y()
        text = "x: {0},y: {1}".format(x, y)
        self.label.setText(text)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = FileChooserApp()
    ex.show()
    sys.exit(app.exec_())
View Code

注释写的很清楚了,这里直接演示效果。鼠标在界面内移动,坐标实时显示,

4.事件发送,获取触发事件的信息

class FileChooserApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    # 事件发送,获取某个事件行为
    def initUI(self):
        btn1 = QPushButton("Button 1", self)
        btn1.move(30, 50)

        btn2 = QPushButton("Button 2", self)
        btn2.move(150, 50)

        btn1.clicked.connect(self.click)
        btn2.clicked.connect(self.click)

        self.statusBar()  # 底部状态栏

        self.setGeometry(500, 500, 290, 150)
        self.setWindowTitle('button')

    def click(self):
        sender = self.sender()  # 用于接收信号
        self.statusBar().showMessage(sender.text())  # 状态栏设置点击按钮的内容


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = FileChooserApp()
    ex.show()
    sys.exit(app.exec_())
View Code

当我们点击两个按钮中任意一个时,sender()方法接收信号的来源于,来判断是点击哪个按钮触发的信号。

5.可输入内容弹框(QInputDialog)

class FileChooserApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    # 二级输入弹框
    def initUI(self):
        self.btn = QPushButton('Dialog', self)
        self.btn.move(20, 20)
        self.btn.clicked.connect(self.showDialog)

        self.le = QLineEdit(self)
        self.le.move(130, 22)

        self.setGeometry(500, 500, 290, 150)
        self.setWindowTitle('Input dialog')

    def showDialog(self):
        """
        QInputDialog创建弹框,第一个参数表示弹框title,第二个参数表示输入框说明
        text为输入后返回的内容
        ok:bool类型,ok为true,false为cancel
        """

        text, ok = QInputDialog.getText(self, 'Input Dialog',
                                        '输入你的名字')

        if ok:
            self.le.setText(str(text))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = FileChooserApp()
    ex.show()
    sys.exit(app.exec_())
View Code

点击按钮时触发QInputDialog弹框,输入内容点击ok时,将输入的内容赋予QLineEdit中。

6.颜色组件(QColor)

class FileChooserApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    # 选择颜色
    def initUI(self):
        col = QColor(0, 0, 0)  # 初始化QFrame颜色

        self.btn = QPushButton('Dialog', self)
        self.btn.move(20, 20)

        self.btn.clicked.connect(self.showDialog)

        self.frm = QFrame(self)
        self.frm.setStyleSheet("QWidget { background-color: %s }"
                               % col.name())  # 设置QFrame样式,col.name() 返回的是一个有效的颜色值
        self.frm.setGeometry(130, 22, 100, 100)

        self.setGeometry(300, 300, 250, 180)
        self.setWindowTitle('Color dialog')

    def showDialog(self):
        col = QColorDialog.getColor()  # 弹出颜色选择框
        if col.isValid():  # true设置颜色,false返回
            self.frm.setStyleSheet("QWidget { background-color: %s }"
                                   % col.name())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = FileChooserApp()
    ex.show()
    sys.exit(app.exec_())
View Code

点击按钮时弹出颜色选择框(QColorDialog.getColor()),选择颜色后isValid()判断是否已选择,或者取消选择。

7.文字字体类型组件

class FileChooserApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        btn = QPushButton('选择字体', self)
        btn.setSizePolicy(QSizePolicy.Fixed,
                          QSizePolicy.Fixed)

        btn.move(20, 20)

        btn.clicked.connect(self.showDialog)
        self.ql = QLineEdit(self)
        self.ql.move(150,20)

        self.setGeometry(500, 500, 250, 180)
        self.setWindowTitle('字体')

    def showDialog(self):
        font, ok = QFontDialog.getFont()  # 打开文本选择框,font为返回的格式,ok为true
        if ok:
            self.ql.setFont(font)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = FileChooserApp()
    ex.show()
    sys.exit(app.exec_())
View Code

点击按钮时弹出字体类型选择框(QFontDialog.getFont()),选择字体后返回一个字体类型和一个bool值,判断是否已选择,或者取消选择。

8.复选框(QCheckBox)

    # 复选框
    def initUI(self):
        self.laber = QLabel(self)
        self.laber.setText("初始值")
        self.laber.move(150, 20)
        cb = QCheckBox('复选框', self)  # 创建一个复选框,
        cb.move(20, 20)
        cb.toggle()
        """
            切换复选框的选中状态。如果复选框当前是未选中的,它将被选中;如果它是已选中的,它将被取消选中。
            默认情况下,新创建的复选框是未选中的。因此,调用toggle()将使其变为选中状态
            """
        cb.stateChanged.connect(self.changeTitle)  # stateChanged选择状态发送变化时

        self.setGeometry(500, 500, 250, 150)
        self.setWindowTitle('QCheckBox')

    def changeTitle(self, state):

        if state == Qt.Checked:  # 当选中时,重置文本
            self.laber.setText("已选中")
        else:
            self.laber.setText("未选中")  # 当未选中时,重置文本
View Code

效果如下

9.按钮状态切换

    def initUI(self):
        self.col = QColor(0, 0, 0)  # 初始值为黑色
        redb = QPushButton('Red', self)
        redb.setCheckable(True)
        redb.move(10, 10)
        redb.clicked[bool].connect(self.setColor)  # 返回bool类型

        greenb = QPushButton('greenb', self)
        greenb.setCheckable(True)  # 设置按钮为可选择按钮
        greenb.move(100, 10)
        greenb.clicked[bool].connect(self.setColor)  # 返回bool类型

        blueb = QPushButton('blueb', self)
        blueb.setCheckable(True)
        blueb.move(200, 10)
        blueb.clicked[bool].connect(self.setColor)  # 返回bool类型

        self.frame = QFrame(self)
        self.frame.move(100, 100)
        self.frame.setStyleSheet("QFrame { background-color: %s }"
                                 % self.col.name())  # 设置QFrame样式,col.name() 返回的是一个有效的颜色值

    def setColor(self, status):
        sender = self.sender()  # 获取信号源
        if status:
            val = 255  # 颜色深度
        else:
            val = 0  #
        if sender.text() == "Red":
            self.col.setRed(val)  # 设置color为红色
        elif sender.text() == "greenb":
            self.col.setGreen(val)  # 设置颜色,数字表示颜色深度
        elif sender.text() == "blueb":
            self.col.setBlue(val)
        self.frame.setStyleSheet("QWidget { background-color: %s }"
                                 % self.col.name())  # 设置QFrame样式,col.name() 返回的是一个有效的颜色值
View Code

创建了三个按钮,分别是红,绿,蓝,设置按钮为可选择按钮。当点击按钮时,发送信号给槽,返回一个bool值,setcolor接收这个bool值,判断为true时,设置颜色深度,并通过sender()来获取是哪个按钮被点击了,从而设置QFrame的值。

 上面实例中有个小缺陷,在选中一个按钮是,应当判断其它按钮有没有被选中,若选中需取消选择,这样不会出现颜色偏差。

10.滑块组件

 # 滑块
    def initUI(self):
        sld_h = QSlider(Qt.Horizontal, self)  # 设置水平滑块
        sld_h.move(0,0)
        sld_v = QSlider(Qt.Vertical, self)  # 设置垂直滑块
        sld_v.move(0,100)
        sld_h.setFocusPolicy(Qt.NoFocus)  # 设置水平滑块键盘不可滑动
        # 设置滑块的范围
        sld_h.setRange(0, 100)
        # 设置滑块的初始值
        sld_h.setValue(0)
        sld_h.setValue(50)
        sld_h.valueChanged[int].connect(self.slider)  # 返回一个数字

        self.label = QLabel(self)
        self.label.setText("初始值")
        # self.label.setPixmap(QPixmap('mute.png'))  # 可将label控件添加图片,可以制作音量调节
        self.label.move(200,0)

        self.setGeometry(500,500,500,500)

    def slider(self, i):  # 接收数字时判断
        if i == 0:
            self.label.setText("最小值")
        elif 0 < i < 50:
            self.label.setText("中间值")
        else:
            self.label.setText("最大值")
View Code

11.日志

    # 日历
    def initUI(self):
        cal = QCalendarWidget(self)  # 创建一个日历控件
        cal.setGridVisible(False)  # 设置控件网格是否可见,True可见
        cal.clicked[QDate].connect(self.showDate)  # 返回一个基于pyqt5的日期格式
        self.lbl = QLabel(self)
        self.lbl.move(0, 350)
        date = cal.selectedDate()  # 获取当前时间
        print(date)
        self.lbl.setText(date.toString())  # 设置默认展示当前时间
        self.setGeometry(500, 500, 500, 500)

    def showDate(self, data):
        self.lbl.setText(data.toString())
View Code

12.下拉框

import sys

from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QComboBox


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    # 下拉框
    def initUI(self):
        self.lbl = QLabel("Ubuntu", self)

        combo = QComboBox(self)  # 创建一个下拉框控件
        combo.addItem("")
        combo.addItem("")
        combo.addItem("绿")
        combo.addItem("")
        combo.addItem("")

        combo.move(50, 50)
        self.lbl.move(50, 150)

        combo.activated[str].connect(self.onActivated)  # 当下拉框索引发送变化时,返回一个选择值

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('QComboBox')

    def onActivated(self, st):
        self.lbl.setText(st)
        self.lbl.adjustSize()  # 自定义适配长度


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
View Code

 

与PyQt5 GUI编程(组件使用)相似的内容:

PyQt5 GUI编程(组件使用)

一.简介 PyQt5 是一个用于创建图形用户界面(GUI)应用程序的 Python 绑定,它基于 Qt 库。PyQt5 提供了大量的组件(也称为控件或部件),用于构建复杂的用户界面。以下是一些常用的 PyQt5 组件 二.组件用法 1.数字组件(QLCDNumber) class FileChoos

pyqt5 子线程如何操作主线程GUI

一.简介 在使用pyqt5编写gui时遇到两个问题,会导致界面崩溃,今天就围绕这两个问题来简单说明和改进。 1.在主线程中使用while无限循环会导致界面崩溃 2.在子线程中操作主线程gui会导致界面崩溃 二.步骤说明 1.在主线程中使用while无限循环会导致界面崩溃 1)错误代码 import

使用pyqt5制作简单计分桌面应用

这是一个自己写的使用pyqt5制作简单计分桌面应用的实例,包含完整代码,希望对大家有所帮助。制作这个小程序的起因是因为有个艺术类比赛需要设计这个一个桌面程序,方便统分。

PyQt5自定义信号

一.简介 在 PyQt5 中,自定义信号是一个常见的任务,通常用于在对象之间传递信息或触发特定行为。自定义信号需要继承自 QtCore.pyqtSignal 并定义其参数类型。 二.操作步骤 1.导入必要的模块 from PyQt5.QtCore import QObject, pyqtSignal

【Python进阶-PyQt5】00搭建PyQt5环境

1.创建独立开发虚拟环境 1.1虚拟环境简介 我们编写的程序,有时用到的Python库是不一样的,比如说开发桌面应用程序我们主要用到PyQt5相关的Python库、开发Web应用程序我们主要用到Django相关的Python库等等。假设我们在开发桌面应用程序的时候除了PyQt5相关的Python库外