PySide6 实操指南:系统页面跳转与控件使用
基本页面跳转实现
在PySide6中实现页面跳转通常有以下几种方法:
1. 使用QStackedWidget
from PySide6.QtWidgets import QApplication, QMainWindow, QStackedWidget, QPushButton, QLabel
app = QApplication([])
# 主窗口
window = QMainWindow()
window.setGeometry(100, 100, 400, 300)
# 创建堆叠窗口部件
stacked_widget = QStackedWidget()
window.setCentralWidget(stacked_widget)
# 页面1
page1 = QLabel("这是页面1")
button1 = QPushButton("跳转到页面2", page1)
button1.move(150, 200)
stacked_widget.addWidget(page1)
# 页面2
page2 = QLabel("这是页面2")
button2 = QPushButton("返回页面1", page2)
button2.move(150, 200)
stacked_widget.addWidget(page2)
# 连接按钮信号
button1.clicked.connect(lambda: stacked_widget.setCurrentIndex(1))
button2.clicked.connect(lambda: stacked_widget.setCurrentIndex(0))
stacked_widget.setCurrentIndex(0)
window.show()
app.exec()
2. 使用单独窗口
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QDialog
class SecondWindow(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("第二窗口")
self.setGeometry(200, 200, 300, 200)
label = QLabel("这是第二个窗口", self)
label.move(100, 80)
app = QApplication([])
# 主窗口
main_window = QMainWindow()
main_window.setWindowTitle("主窗口")
main_window.setGeometry(100, 100, 400, 300)
button = QPushButton("打开第二窗口", main_window)
button.move(150, 200)
button.clicked.connect(lambda: SecondWindow().exec())
main_window.show()
app.exec()
常用控件使用示例
按钮(QPushButton)
from PySide6.QtWidgets import QPushButton
button = QPushButton("点击我")
button.setStyleSheet("""
QPushButton {
background-color: #4CAF50;
border: none;
color: white;
padding: 10px 24px;
text-align: center;
font-size: 16px;
margin: 4px 2px;
border-radius: 8px;
}
QPushButton:hover {
background-color: #45a049;
}
""")
# 连接点击事件
button.clicked.connect(lambda: print("按钮被点击了!"))
文本框(QLineEdit)
from PySide6.QtWidgets import QLineEdit
line_edit = QLineEdit()
line_edit.setPlaceholderText("请输入文本...")
line_edit.setStyleSheet("""
QLineEdit {
padding: 8px;
border: 2px solid #ccc;
border-radius: 4px;
font-size: 14px;
}
QLineEdit:focus {
border-color: #66afe9;
}
""")
# 获取文本
text = line_edit.text()
下拉框(QComboBox)
from PySide6.QtWidgets import QComboBox
combo_box = QComboBox()
combo_box.addItems(["选项1", "选项2", "选项3"])
combo_box.setCurrentIndex(0) # 设置默认选中项
# 获取当前选中项
current_text = combo_box.currentText()
current_index = combo_box.currentIndex()
# 连接选择变化事件
combo_box.currentIndexChanged.connect(lambda index: print(f"选中了第{index+1}个选项"))
表格(QTableWidget)
from PySide6.QtWidgets import QTableWidget, QTableWidgetItem
table = QTableWidget(3, 3) # 3行3列
table.setHorizontalHeaderLabels(["列1", "列2", "列3"])
# 填充数据
for row in range(3):
for col in range(3):
item = QTableWidgetItem(f"数据{row+1}-{col+1}")
table.setItem(row, col, item)
# 设置样式
table.setStyleSheet("""
QTableWidget {
gridline-color: #ddd;
font-size: 14px;
}
QHeaderView::section {
background-color: #f8f8f8;
padding: 5px;
border: 1px solid #ddd;
}
""")
高级应用:带参数的页面跳转
from PySide6.QtWidgets import (QApplication, QMainWindow, QPushButton,
QVBoxLayout, QWidget, QLabel, QLineEdit)
class LoginPage(QWidget):
def __init__(self, main_window):
super().__init__()
self.main_window = main_window
self.init_ui()
def init_ui(self):
layout = QVBoxLayout()
self.username_input = QLineEdit()
self.username_input.setPlaceholderText("用户名")
self.password_input = QLineEdit()
self.password_input.setPlaceholderText("密码")
self.password_input.setEchoMode(QLineEdit.Password)
login_btn = QPushButton("登录")
login_btn.clicked.connect(self.login)
layout.addWidget(self.username_input)
layout.addWidget(self.password_input)
layout.addWidget(login_btn)
self.setLayout(layout)
def login(self):
username = self.username_input.text()
password = self.password_input.text()
# 验证逻辑...
if username and password:
self.main_window.show_main_page(username)
class MainPage(QWidget):
def __init__(self, username):
super().__init__()
self.username = username
self.init_ui()
def init_ui(self):
layout = QVBoxLayout()
welcome_label = QLabel(f"欢迎, {self.username}!")
layout.addWidget(welcome_label)
self.setLayout(layout)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("应用演示")
self.setGeometry(100, 100, 400, 300)
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
self.login_page = LoginPage(self)
self.main_page = None
self.show_login_page()
def show_login_page(self):
self.central_widget.layout = QVBoxLayout()
self.central_widget.layout.addWidget(self.login_page)
self.central_widget.setLayout(self.central_widget.layout)
def show_main_page(self, username):
if self.main_page:
self.central_widget.layout.removeWidget(self.main_page)
self.main_page.deleteLater()
self.main_page = MainPage(username)
self.central_widget.layout.addWidget(self.main_page)
self.central_widget.setLayout(self.central_widget.layout)
app = QApplication([])
window = MainWindow()
window.show()
app.exec()
小贴士
-
信号与槽机制:PySide6使用信号(signal)和槽(slot)机制处理事件,这是Qt的核心特性
-
样式表:可以使用CSS类似的语法来美化控件
-
布局管理:合理使用QVBoxLayout、QHBoxLayout等布局管理器,而不是直接设置位置
-
多线程:耗时操作应该放在单独的线程中,避免阻塞UI线程
-
国际化:使用Qt的翻译系统可以轻松实现多语言支持
希望这个指南能帮助你快速上手PySide6的页面跳转和控件使用!