PyQt5 是针对 Python 的一套 GUI(图形用户界面)框架,它可以用于开发不同平台(Windows、Linux、Mac OS)下的应用程序。本教程将介绍 PyQt5 的基础知识,包括 Qt Designer(一个 GUI 工具)的使用、部件(widget)的使用、布局管理、事件处理和线程等。
安装 PyQt5
在安装 PyQt5 之前需要先安装 Python,推荐安装 Python 3.x 版本。接着,你可以通过以下命令在命令行中安装 PyQt5:
pip install PyQt5
Qt Designer 的使用
Qt Designer 是一个 GUI 工具,用于设计 GUI 界面。使用 Qt Designer 可以快速创建应用程序的用户界面。
要使用 Qt Designer,可以通过以下命令启动它:
designer
或者在 PyQt5 中使用以下命令启动:
from PyQt5 import QtWidgets, uic
app = QtWidgets.QApplication([])
dlg = uic.loadUi("mainWindow.ui")
dlg.show()
app.exec()
其中,mainWindow.ui
是通过 Qt Designer 创建的一个用户界面文件。
部件的使用
PyQt5 中的部件是用于创建 GUI 界面的基本单元,包括按钮、文本框、标签、进度条等。以下是一些常用的部件:
- QLabel:用于显示文本和图像。
- QLineEdit:用于接受用户输入的文本框。
- QPushButton:用于触发某些动作的按钮。
- QCheckBox:用于选择一个或多个选项的复选框。
- QRadioButton:用于在一组互斥的选项中选择一个的单选按钮。
以下是一个使用 QPushButton 和 QLabel 的示例代码:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
button = QPushButton('Click me')
label = QLabel('Hello World')
layout.addWidget(button)
layout.addWidget(label)
window.setLayout(layout)
def on_button_clicked():
label.setText('Button clicked')
button.clicked.connect(on_button_clicked)
window.show()
app.exec()
布局管理
通过布局管理,可以更好地控制 GUI 界面中部件的位置和大小,使得应用程序的用户界面更加整洁美观。
PyQt5 中常用的布局管理器有 QVBoxLayout、QHBoxLayout、QGridLayout 和 QFormLayout。
以下是一个使用 QHBoxLayout 的示例代码:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout
app = QApplication([])
window = QWidget()
layout = QHBoxLayout()
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 2')
layout.addWidget(button1)
layout.addWidget(button2)
window.setLayout(layout)
window.show()
app.exec()
事件处理
事件处理用于在用户与部件进行交互时响应事件,例如单击、拖动、滚动等。
在 PyQt5 中,事件处理主要通过信号(signal)和槽(slot)来实现。信号是在部件上发生的事件,例如按钮被单击。槽是与信号相关联的 Python 函数,当信号被发射时槽将被调用。
以下是一个使用信号和槽的示例代码:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox
app = QApplication([])
window = QWidget()
button = QPushButton('Click me')
window.setCentralWidget(button)
def on_button_clicked():
QMessageBox.information(window, 'Message', 'Button clicked')
button.clicked.connect(on_button_clicked)
window.show()
app.exec()
示例说明
示例一:一个计算器应用程序
以下是一个简单的计算器应用程序,支持加、减、乘、除四种运算。
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QLineEdit, QPushButton
class CalculatorWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('Calculator')
self.setFixedSize(300, 250)
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
grid_layout = QGridLayout(central_widget)
self.input_field = QLineEdit()
self.input_field.setReadOnly(True)
buttons = [
'C', 'Del', '+', '-',
'7', '8', '9', '*',
'4', '5', '6', '/',
'1', '2', '3', '=',
'0', '.', '(', ')'
]
positions = [(i, j) for i in range(5) for j in range(4)]
for position, label in zip(positions, buttons):
button = QPushButton(label)
grid_layout.addWidget(button, *position)
if label == 'C':
button.clicked.connect(self.clear_input_field)
elif label == 'Del':
button.clicked.connect(self.delete_last_input_character)
elif label == '+':
button.clicked.connect(self.addition)
elif label == '-':
button.clicked.connect(self.subtraction)
elif label == '*':
button.clicked.connect(self.multiplication)
elif label == '/':
button.clicked.connect(self.division)
elif label == '=':
button.clicked.connect(self.calculate)
else:
button.clicked.connect(lambda value=label: self.append_input_field(value))
def clear_input_field(self):
self.input_field.clear()
def delete_last_input_character(self):
text = self.input_field.text()
self.input_field.setText(text[:-1])
def append_input_field(self, value):
self.input_field.setText(self.input_field.text() + str(value))
def addition(self):
self.append_input_field('+')
def subtraction(self):
self.append_input_field('-')
def multiplication(self):
self.append_input_field('*')
def division(self):
self.append_input_field('/')
def calculate(self):
try:
result = eval(self.input_field.text())
except:
result = 'Error'
self.input_field.setText(str(result))
app = QApplication([])
window = CalculatorWindow()
window.show()
app.exec()
示例二:一个简单的时钟应用程序
以下是一个简单的时钟应用程序,每秒钟更新当前时间。
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QLabel
class ClockWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('Clock')
self.setFixedSize(250, 100)
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
layout = QVBoxLayout(central_widget)
self.time_label = QLabel()
layout.addWidget(self.time_label)
timer = QTimer(self)
timer.timeout.connect(lambda: self.time_label.setText(QTime.currentTime().toString()))
timer.start(1000)
app = QApplication([])
window = ClockWindow()
window.show()
app.exec()
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5 基础教程 - Python技术站