PyQt 界面布局与交互组件使用指南

发布于:2025-09-10 ⋅ 阅读:(18) ⋅ 点赞:(0)

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, QVBoxLayout

app = 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, QVBoxLayout

app = 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, QVBoxLayout

class 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, QLabel

class 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, QLabel

class 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, QLabel

class 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_())

这里定义了继承自 QMainWindowMyMainWindow 类,在其中设置中央部件,进行界面初始化,按钮点击时会改变标签的文本,充分体现了面向对象封装、易扩展的特点。


网站公告

今日签到

点亮在社区的每一天
去签到