目录
6.6 QSlider(调整数值范围和显示进度) 和 QProgressBar(显示某个任务的完成进度)
1、 PyQt6 简介
PyQt6
是 Qt 6 框架的 Python 绑定,它提供了对 Qt 的所有核心功能的访问,包括窗口管理、UI 控件、事件处理等。PyQt6 是一个跨平台工具,支持 Windows、MacOS 和 Linux 系统,可以用来开发桌面应用、数据可视化、游戏界面等多种类型的图形界面应用。
安装 PyQt6:
要开始使用 PyQt6,首先需要安装它。可以通过 pip
来安装:
pip install PyQt6
安装完成后,你就可以开始编写 PyQt6 应用了。
2. 创建一个基本窗口
我们从一个最简单的窗口开始。PyQt6 提供了 QWidget
类作为所有 GUI 控件的基类,而 QMainWindow
类用于创建主窗口。
下面是一个创建简单窗口的代码示例:
import sys
from PyQt6.QtWidgets import QApplication, QWidget
# 创建一个简单的窗口
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("pyqt6 基本窗口")
# 100:窗口左上角的x坐标,即窗口在屏幕上的水平位置。值为100意味着窗口距离屏幕左边缘100像素。
# 200:窗口左上角的y坐标,即窗口在屏幕上的垂直位置。值为200意味着窗口距离屏幕顶部200像素。
# 400:窗口的宽度,单位为像素。在此例中,窗口的宽度是400像素。
# 300:窗口的高度,单位为像素。在此例中,窗口的高度是300像素。
self.setGeometry(100, 100, 400, 300)
def main():
app = QApplication(sys.argv) # 创建应用对象
window = MyWindow() # 创建窗口对象
window.show() # 显示窗口
sys.exit(app.exec()) # 启动事件循环
if __name__ == '__main__':
main()
代码解读:
QApplication(sys.argv)
:每个 PyQt 应用都需要一个QApplication
实例来管理应用的控制流和主要设置。QWidget
是 PyQt6 中所有控件的基类。我们通过继承QWidget
创建了一个自定义窗口类MyWindow
,并在其中设置了窗口标题和窗口大小。show()
用于显示窗口,exec()
启动应用的事件循环,确保应用能够响应用户操作。
运行上面的代码,将看到一个简单的窗口弹出。
3. 添加控件
PyQt6 提供了许多常见的 UI 控件,如按钮、文本框、标签等。通过布局管理器和控件将界面进行组合。
例如,下面的代码展示了如何创建一个简单的窗口,包含一个按钮和一个标签:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt6 控件示例")
self.setGeometry(100, 100, 300, 200)
# 创建控件
self.label = QLabel("Hello, PyQt6!", self)
self.button = QPushButton("点击我", self)
# 创建垂直布局器
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.button)
# 设置窗口的布局
self.setLayout(layout)
# 连接按钮点击信号
self.button.clicked.connect(self.on_click)
def on_click(self):
self.label.setText("按钮已点击!")
def main():
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
代码解读:
QLabel
用来显示文本,QPushButton
用来创建按钮。QVBoxLayout
是一种布局管理器,能够将控件垂直排列(自动布局)。我们通过layout.addWidget()
将控件添加到布局中。self.button.clicked.connect(self.on_click)
将按钮的点击事件(clicked
信号)连接到on_click
方法。当按钮被点击时,on_click
方法会改变标签的文本。
增加一个退出点击事件:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QMessageBox
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.title = 'PyQt6 Window'
self.left = 100
self.top = 100
self.width = 640
self.height = 480
self.init_ui()
def init_ui(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
# 创建控件
self.label = QLabel('Hello, pyqt6:', self)
self.label2 = QLabel('请输入你的名字:', self)
self.label3 = QLabel('你好,', self)
self.button = QPushButton('点击我', self)
self.button2 = QPushButton('退出', self)
# 创建垂直布局器
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.label2)
layout.addWidget(self.label3)
layout.addWidget(self.button)
layout.addWidget(self.button2)
# 设置窗口的布局
self.setLayout(layout)
# 连接按钮点击信号
self.button.clicked.connect(self.on_click)
self.button2.clicked.connect(self.on_exit)
def on_click(self):
self.label.setText('你按钮已经被点击了!')
def on_exit(self):
reply = QMessageBox.question(
self, '退出', '确认退出吗?',
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
QMessageBox.StandardButton.No)
if reply == QMessageBox.StandardButton.Yes:
QApplication.quit()
else:
print('取消退出')
def main():
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
4. 信号与槽
在 PyQt6 中,信号与槽是事件处理的核心机制。信号是由某些事件触发的消息,比如按钮被点击、文本框内容发生变化等;槽是响应信号的函数。当信号被发出时,连接到该信号的槽会自动执行。
在前面的代码中已经用到过信号(connect发送信号)与槽(例如按钮点击事件)。这里再简单解释一下:
self.button.clicked.connect(self.on_click)
上面的代码表示当按钮被点击时,on_click
方法将会被执行(on_click
方法就是槽)。可以为每个控件绑定不同的信号与槽,创建交互丰富的应用。
5. 基本布局管理
布局管理器是 PyQt 中用于自动排列控件的位置和大小的工具。除了 QVBoxLayout
(垂直布局),PyQt6 还提供了其他布局管理器,如 QHBoxLayout
(水平布局)、QGridLayout
(网格布局)等。
1、水平布局示例:
import sys
from PyQt6.QtWidgets import QHBoxLayout, QLineEdit, QPushButton, QWidget, QApplication
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("水平布局示例")
self.setGeometry(100, 100, 300, 100)
# 创建控件
self.line_edit = QLineEdit(self) # 单行输入框
self.button = QPushButton("提交", self)
# 创建水平布局器
layout = QHBoxLayout()
layout.addWidget(self.line_edit)
layout.addWidget(self.button)
# 设置布局
self.setLayout(layout)
def main():
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
代码解读:
QHBoxLayout
会将控件水平排列,适合于在一行中展示多个控件。
2、网格布局示例
import sys
from PyQt6.QtWidgets import (
QApplication,
QWidget,
QLabel,
QLineEdit,
QPushButton,
QGridLayout,
)
class GridLayoutExample(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 设置窗口标题
self.setWindowTitle("PyQt6 网格布局示例")
# 创建一个网格布局
grid = QGridLayout()
# 添加标签和输入框
grid.addWidget(QLabel("姓名:"), 0, 0) # 在第0行第0列添加标签
grid.addWidget(QLineEdit(), 0, 1) # 在第0行第1列添加输入框
grid.addWidget(QLabel("邮箱:"), 1, 0) # 在第1行第0列添加标签
grid.addWidget(QLineEdit(), 1, 1) # 在第1行第1列添加输入框
# 添加按钮
grid.addWidget(QPushButton("确定"), 2, 0) # 在第2行第0列添加按钮
grid.addWidget(QPushButton("取消"), 2, 1) # 在第2行第1列添加按钮
# 设置窗口布局
self.setLayout(grid)
if __name__ == "__main__":
app = QApplication(sys.argv)
# 创建窗口实例
window = GridLayoutExample()
window.resize(300, 150) # 设置窗口大小
window.show() # 显示窗口
sys.exit(app.exec())
-
QGridLayout:
addWidget(widget, row, column)
:将控件添加到网格布局中的指定位置。- 行和列从
0
开始编号。
-
控件的排列:
- 第一行放置了一个标签和一个输入框。
- 第二行放置了另一个标签和输入框。
- 第三行放置了两个按钮,分别位于不同的列。
6. PyQt6 常用控件及其用法
6.1 QLabel(显示文本或图像)
QLabel
是一个用于显示文本或图像的控件。它通常用于显示静态信息,比如应用程序的标题、图标等。
1)显示文本
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QFont
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建一个QLabel实例,并设置其文本内容
label = QLabel('Hello, PyQt6!', self)
label.setAlignment(Qt.AlignmentFlag.AlignCenter) # 设置文本居中
label.setFont(QFont('Arial', 20, QFont.Weight.Bold)) # 设置文本加粗
label.setWordWrap(True) # 设置文本自动换行
# 创建一个垂直布局并添加QLabel到这个布局中
vbox = QVBoxLayout()
vbox.addWidget(label)
# 设置窗口的布局
self.setLayout(vbox)
# 设置窗口的一些属性
self.setWindowTitle('QLabel示例 - 文本')
self.setGeometry(300, 300, 300, 200) # x, y, width, height
# 显示窗口
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app