在PyQt5中,QTabWidget
是一个用于管理多个选项卡页面的容器控件。以下是其使用方法的详细说明和示例:
1. 基本用法
python
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QLabel, QVBoxLayout
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("QTabWidget 示例")
self.setGeometry(100, 100, 400, 300)
# 创建 QTabWidget
self.tab_widget = QTabWidget()
self.setCentralWidget(self.tab_widget) # 将 QTabWidget 设置为主窗口的中心部件
# 创建两个标签页
self.tab1 = QWidget()
self.tab2 = QWidget()
# 添加标签页到 QTabWidget
self.tab_widget.addTab(self.tab1, "选项卡1")
self.tab_widget.addTab(self.tab2, "选项卡2")
# 初始化标签页内容
self.init_tab1()
self.init_tab2()
def init_tab1(self):
layout = QVBoxLayout()
label = QLabel("这是第一个标签页的内容")
layout.addWidget(label)
self.tab1.setLayout(layout)
def init_tab2(self):
layout = QVBoxLayout()
label = QLabel("这是第二个标签页的内容")
layout.addWidget(label)
self.tab2.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
2. 核心功能
添加/删除标签页
- 添加标签页 :使用
addTab(widget, title)
或insertTab(index, widget, title)
- 删除标签页 :使用
removeTab(index)
python
# 动态添加标签页示例
new_tab = QWidget()
self.tab_widget.addTab(new_tab, "新选项卡")
# 删除第一个标签页
self.tab_widget.removeTab(0)
设置选项卡位置
python
self.tab_widget.setTabPosition(QTabWidget.North) # 上方(默认)
self.tab_widget.setTabPosition(QTabWidget.South) # 下方
self.tab_widget.setTabPosition(QTabWidget.West) # 左侧
self.tab_widget.setTabPosition(QTabWidget.East) # 右侧
信号与槽
currentChanged(int index)
:当切换标签页时触发tabCloseRequested(int index)
:当关闭标签页时触发(需启用可关闭属性)
python
# 连接信号
self.tab_widget.currentChanged.connect(self.on_tab_changed)
def on_tab_changed(self, index):
print(f"切换到标签页 {index}")
3. 高级功能
可关闭的标签页
python
self.tab_widget.setTabsClosable(True) # 显示关闭按钮
self.tab_widget.tabCloseRequested.connect(self.close_tab) # 绑定关闭事件
def close_tab(self, index):
self.tab_widget.removeTab(index)
自定义图标和样式
python
from PyQt5.QtGui import QIcon
# 设置标签页图标
self.tab_widget.addTab(self.tab1, QIcon("icon.png"), "带图标的标签页")
# 使用 QSS 自定义样式
self.tab_widget.setStyleSheet("""
QTabWidget::pane { border: 1px solid #999; }
QTabBar::tab { padding: 10px; background: #EEE; }
QTabBar::tab:selected { background: #FFF; }
""")
4. 完整示例
python
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QLabel, QPushButton, QVBoxLayout
from PyQt5.QtGui import QIcon
class TabDemo(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("高级 QTabWidget 示例")
self.setGeometry(100, 100, 600, 400)
self.tab_widget = QTabWidget()
self.setCentralWidget(self.tab_widget)
# 标签页1:普通内容
self.tab1 = QWidget()
self.tab_widget.addTab(self.tab1, "基本信息")
layout1 = QVBoxLayout()
layout1.addWidget(QLabel("姓名:张三"))
layout1.addWidget(QLabel("年龄:30"))
self.tab1.setLayout(layout1)
# 标签页2:按钮和交互
self.tab2 = QWidget()
self.tab_widget.addTab(self.tab2, QIcon("settings.png"), "设置")
layout2 = QVBoxLayout()
self.button = QPushButton("点击我")
self.button.clicked.connect(lambda: print("按钮被点击!"))
layout2.addWidget(self.button)
self.tab2.setLayout(layout2)
# 启用可关闭标签页
self.tab_widget.setTabsClosable(True)
self.tab_widget.tabCloseRequested.connect(self.close_tab)
def close_tab(self, index):
self.tab_widget.removeTab(index)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = TabDemo()
window.show()
sys.exit(app.exec_())
5. 注意事项
- 布局管理:确保每个标签页内的控件正确添加到布局中,否则可能无法显示。
- 内存管理:动态移除标签页时,PyQt5会自动释放资源,但复杂控件需手动清理。
- 性能:避免在单个标签页中添加过多控件,影响界面响应速度。
通过上述方法,可以高效地利用 QTabWidget
构建清晰、易用的多页面界面。