PyQt 界面布局与交互组件使用指南
PyQt 界面布局与交互组件使用指南
在 PyQt 开发中,界面布局和交互组件是构建友好应用程序的关键。下面将详细介绍常用的布局方式与交互组件的使用方法。
1.1 代码布局
1.1.1 水平布局 QHBoxLayout
QHBoxLayout
用于将控件在水平方向上排列。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout# 创建应用程序实例
app = QApplication(sys.argv)
# 创建窗口实例
window = QWidget()
window.setWindowTitle('水平布局示例')# 创建水平布局对象
layout = QHBoxLayout()# 创建三个按钮
btn1 = QPushButton('按钮 1')
btn2 = QPushButton('按钮 2')
btn3 = QPushButton('按钮 3')# 将按钮添加到水平布局中
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.addWidget(btn3)# 将布局设置到窗口上
window.setLayout(layout)# 显示窗口
window.show()
# 进入应用程序的主循环
sys.exit(app.exec_())
代码中,先导入必要的模块。然后创建应用和窗口,接着实例化 QHBoxLayout
布局,创建三个按钮并添加到该布局,最后将布局设置到窗口并显示。运行后,三个按钮会在窗口中水平排列。
1.1.2 竖直布局 QVBoxLayout
QVBoxLayout
用于将控件在竖直方向上排列。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayoutapp = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('竖直布局示例')# 创建竖直布局对象
layout = QVBoxLayout()btn1 = QPushButton('按钮 1')
btn2 = QPushButton('按钮 2')
btn3 = QPushButton('按钮 3')# 将按钮添加到竖直布局中
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.addWidget(btn3)window.setLayout(layout)window.show()
sys.exit(app.exec_())
这里和水平布局类似,只是将布局换成了 QVBoxLayout
。运行后,三个按钮会在窗口中竖直排列。
1.1.3 嵌套布局
嵌套布局就是将不同的布局组合在一起,实现更复杂的界面布局。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayoutapp = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('嵌套布局示例')# 外层竖直布局
main_layout = QVBoxLayout()# 内层水平布局 1
h_layout1 = QHBoxLayout()
btn1 = QPushButton('按钮 1')
btn2 = QPushButton('按钮 2')
h_layout1.addWidget(btn1)
h_layout1.addWidget(btn2)# 内层水平布局 2
h_layout2 = QHBoxLayout()
btn3 = QPushButton('按钮 3')
btn4 = QPushButton('按钮 4')
h_layout2.addWidget(btn3)
h_layout2.addWidget(btn4)# 将内层水平布局添加到外层竖直布局
main_layout.addLayout(h_layout1)
main_layout.addLayout(h_layout2)window.setLayout(main_layout)window.show()
sys.exit(app.exec_())
此代码先创建外层的竖直布局,然后创建两个内层的水平布局,每个水平布局里放两个按钮,再将内层水平布局添加到外层竖直布局。运行后,界面上会有两行按钮,每行两个,呈水平排列。
1.2 消息对话框 QMessageBox
QMessageBox
用于弹出各种消息对话框,向用户提示信息或获取简单的用户反馈。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QVBoxLayoutclass MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle('消息对话框示例')self.init_ui()def init_ui(self):layout = QVBoxLayout()btn = QPushButton('显示消息对话框')# 绑定按钮点击事件到 show_message 方法btn.clicked.connect(self.show_message)layout.addWidget(btn)self.setLayout(layout)def show_message(self):# 弹出信息对话框QMessageBox.information(self, '信息', '这是一条信息提示')# 弹出警告对话框QMessageBox.warning(self, '警告', '这是一条警告提示')# 弹出问题对话框,获取用户选择reply = QMessageBox.question(self, '问题', '你确定要执行此操作吗?', QMessageBox.Yes | QMessageBox.No)if reply == QMessageBox.Yes:print('用户选择了是')else:print('用户选择了否')app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
代码定义了一个继承自 QWidget
的窗口类 MyWindow
,在其中创建一个按钮,点击按钮会依次弹出信息、警告、问题对话框,对于问题对话框,还会根据用户选择输出相应内容。
1.3 单、复选框
1.3.1 单选框 QRadioButton
单选框同一组内的选项,用户只能选择其中一个。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QVBoxLayout, QLabelclass MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle('单选框示例')self.init_ui()def init_ui(self):layout = QVBoxLayout()self.label = QLabel('还未选择')# 创建单选框组self.radio1 = QRadioButton('选项 1')self.radio2 = QRadioButton('选项 2')self.radio3 = QRadioButton('选项 3')# 绑定单选框状态改变事件self.radio1.toggled.connect(self.on_radio_toggled)self.radio2.toggled.connect(self.on_radio_toggled)self.radio3.toggled.connect(self.on_radio_toggled)layout.addWidget(self.radio1)layout.addWidget(self.radio2)layout.addWidget(self.radio3)layout.addWidget(self.label)self.setLayout(layout)def on_radio_toggled(self):# 获取被选中的单选框radio = self.sender()if radio.isChecked():self.label.setText(f'你选择了:{radio.text()}')app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
这里创建了三个单选框和一个标签,当单选框状态改变时,会触发 on_radio_toggled
方法,在标签上显示选中的单选框内容。
1.3.2 复选框 QCheckBox
复选框同一组内的选项,用户可以选择多个。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QVBoxLayout, QLabelclass MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle('复选框示例')self.init_ui()def init_ui(self):layout = QVBoxLayout()self.label = QLabel('已选择:')self.check1 = QCheckBox('选项 1')self.check2 = QCheckBox('选项 2')self.check3 = QCheckBox('选项 3')# 绑定复选框状态改变事件self.check1.stateChanged.connect(self.on_check_state_changed)self.check2.stateChanged.connect(self.on_check_state_changed)self.check3.stateChanged.connect(self.on_check_state_changed)layout.addWidget(self.check1)layout.addWidget(self.check2)layout.addWidget(self.check3)layout.addWidget(self.label)self.setLayout(layout)def on_check_state_changed(self):selected = []# 检查每个复选框的状态if self.check1.isChecked():selected.append(self.check1.text())if self.check2.isChecked():selected.append(self.check2.text())if self.check3.isChecked():selected.append(self.check3.text())self.label.setText(f'已选择:{", ".join(selected)}')app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
代码创建了三个复选框和一个标签,当复选框状态改变时,on_check_state_changed
方法会收集被选中的复选框内容,在标签上显示。
1.4 PyQt 面向对象开发
面向对象开发能让 PyQt 代码结构更清晰,便于维护和扩展。下面以一个简单的窗口为例,展示面向对象的开发方式。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabelclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('面向对象开发示例')# 设置中央部件self.central_widget = QWidget()self.setCentralWidget(self.central_widget)self.init_ui()def init_ui(self):layout = QVBoxLayout()self.label = QLabel('欢迎使用 PyQt 面向对象开发')btn = QPushButton('点击我')btn.clicked.connect(self.on_btn_clicked)layout.addWidget(self.label)layout.addWidget(btn)self.central_widget.setLayout(layout)def on_btn_clicked(self):self.label.setText('按钮被点击了!')app = QApplication(sys.argv)
window = MyMainWindow()
window.show()
sys.exit(app.exec_())
这里定义了继承自 QMainWindow
的 MyMainWindow
类,在其中设置中央部件,进行界面初始化,按钮点击时会改变标签的文本,充分体现了面向对象封装、易扩展的特点。