容器控件可以将窗口中的控件进行分组处理,使窗口的分类更加清晰,常用的容器控件有GroupBox分组框、TabWidget选项卡和ToolBox工具盒,本节将对它们的常用方法及使用方式进行详解。
1 GroupBox:分组框
GroupBox控件,又称为分组框控件,它主要为其他控件提供分组,并且按照控件的分组来细分窗口的功能。
GroupBox控件对应PyQt5中的QGroupBox类,该类的常用方法及说明如表所示。
| 方 法 | 说 明 |
|---|---|
| setAlignment() | 设置对齐方式,有水平和垂直这两种,分别如下: ◆ 水平对齐方式 ■ Qt.AlignLeft:左对齐 ■ Qt.AlignHCenter:水平居中对齐 ■ Qt.AlignRight:右对齐 ■ Qt.AlignJustify:两端对齐 ◆ 垂直对齐方式 ■ Qt.AlignTop:顶部对齐 ■ Qt.AlignVCenter:垂直居中 ■ Qt.AlignBottom:底部对齐 |
| setTitle() | 设置分组标题 |
| setFlat() | 设置是否以扁平样式显示 |
QGroupBox类中最常用的是setTitle()方法,用来设置分组框的标题,例如,下面代码用来为GroupBox控件设置标题系统登录:
self.groupBox.setTitle("系统登录")
2 TabWidget:选项卡
TabWidget控件,又称为选项卡控件,它可以将窗口设计成多页,以便使窗口的功能划分为多个部分,而每个部分都可以包括多个子控件。
TabWidget控件对应PyQt5中的QTabWidget类,该类的常用方法及说明如表所示。
| 方 法 | 说 明 |
|---|---|
| addTab() | 添加选项卡 |
| inserTab() | 插入选项卡 |
| removeTab() | 删除选项卡 |
| currentWidget() | 获取当前选项卡 |
| currentIndex() | 获取当前选项卡的索引 |
| setCurrentIndex() | 设置当前选项卡的索引 |
| setCurrentWidget() | 设置当前选项卡 |
| setTabPosition() | 设置选项卡的标题位置,支持以下4个位置: ◆ QTabWidget.North:标题在北方,即上边,如图3所示,这是默认值 ◆ QTabWidget.South:标题在南方,即下边,如图4所示 ◆ QTabWidget.West:标题在西方,即左边,如图5所示 ◆ QTabWidget.East:标题在东方,即右边,如图6所示 |
| setTabsClosable() | 设置是否可以独立关闭选项卡,True表示可以关闭,在每个选项卡旁边会有一个关闭按钮,如图7所示;False表示不可以关闭 |
| setTabText() | 设置选项卡标题文本 |
| tabText() | 获取指定选项卡的标题文本 |
- 标题在上边

- 标题在下边

- 标题在左边

- 标题在右边

Info: 说明
TabWidget在显示选项卡时,如果默认大小显示不下,会自动生成先前和先后的箭头,用户可以通过单击箭头,查看未显示的选项卡。
TabWidget控件最常用的信号是currentChanged,该信号在切换选项卡时发射。
实例 选项卡的动态添加和删除
打开Qt Designer设计器,新建一个窗口,在窗口中添加一个TabWidget控件和两个PushButton控件。其中,TabWidget控件作为选项卡,两个PushButton控件分别执行添加和删除选项卡的操作,设计完成后保存为.ui文件,并使用Pyuic工具将其转换为.py代码文件。在.py代码文件中,首先定义三个函数,分别实现新增选项卡、删除选项卡和获取选中的选项卡及索引的功能,主要代码如下:
# 新增选项卡
def addtab(self):
self.atab = QtWidgets.QWidget() # 创建选项卡对象
name = "tab_" + str(self.tabWidget.count() + 1) # 设置选项卡的对象名
self.atab.setObjectName(name) # 设置选项卡的对象名
self.tabWidget.addTab(self.atab, name) # 添加选项卡
# 删除选项卡
def deltab(self):
self.tabWidget.removeTab(self.tabWidget.currentIndex()) # 移除当前选项卡
# 获取选中的选项卡及索引
def gettab(self, currentIndex):
from PyQt5.QtWidgets import QMessageBox
QMessageBox.information(MainWindow, "提示","您选择了 " + self.tabWidget.tabText(currentIndex) + " 选项卡,索引为: " + str(self.tabWidget.currentIndex()), QMessageBox.Ok)
分别为添加和删除按钮,以及选项卡的currentChanged信号绑定自定义的槽函数,代码如下:
# 为“添加”按钮绑定单击信号
self.pushButton.clicked.connect(self.addtab)
# 为“删除”按钮绑定单击信号
self.pushButton_2.clicked.connect(self.deltab)
# 为选项卡绑定页面切换信号
self.tabWidget.currentChanged.connect(self.gettab)
为.py文件添加程序入口,然后运行程序,窗口中默认有两个选项卡,单击添加按钮,可以按顺序添加选项卡;单击删除按钮,可以删除当前鼠标焦点所在的选项卡,如图所示。

当切换选项卡,在弹出的提示框中显示当前选择的选项卡及其索引,如图所示。

Info: 说明 当删除某个选项卡时,选项卡会自动切换到前一个,因此也会弹出相应的信息提示。
3 ToolBox:工具盒
ToolBox控件,又称为工具盒控件,它主要提供一种列状的层叠选项卡。
ToolBox控件对应PyQt5中的QToolBox类,该类的常用方法及说明如表所示。
| 方 法 | 说 明 |
|---|---|
| addItem() | 添加选项卡 |
| setCurrentIndex() | 设置当前选中的选项卡索引 |
| setItemIcon() | 设置选项卡的图标 |
| setItemText() | 设置选项卡的标题文本 |
| setItemEnabled() | 设置选项卡是否可用 |
| inserItem() | 插入新选项卡 |
| removeItem() | 移除选项卡 |
| itemText() | 获取选项卡的文本 |
| currentIndex() | 获取当前选项卡的索引 |
ToolBox控件最常用的信号是currentChanged,该信号在切换选项卡时发射。
实例 实现仿QQ抽屉的效果
打开Qt Designer设计器,使用ToolBox控件,并结合ToolButton工具按钮设计一个仿照QQ抽屉的效果(即一种常用的、能够在有限空间中动态直观地显示更多功能的效果)的窗口,对应.py代码文件的代码如下:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(142, 393)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
# 创建ToolBox工具盒
self.toolBox = QtWidgets.QToolBox(self.centralwidget)
self.toolBox.setGeometry(QtCore.QRect(0, 0, 141, 391))
self.toolBox.setObjectName("toolBox")
# 我的好友设置
self.page = QtWidgets.QWidget()
self.page.setGeometry(QtCore.QRect(0, 0, 141, 287))
self.page.setObjectName("page")
self.toolButton = QtWidgets.QToolButton(self.page)
self.toolButton.setGeometry(QtCore.QRect(0, 0, 120, 51))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("图标/01.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.toolButton.setIcon(icon)
self.toolButton.setIconSize(QtCore.QSize(96, 96))
self.toolButton.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
self.toolButton.setAutoRaise(True)
self.toolButton.setObjectName("toolButton")
self.toolButton_2 = QtWidgets.QToolButton(self.page)
self.toolButton_2.setGeometry(QtCore.QRect(0, 49, 120, 51))
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap("图标/02.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.toolButton_2.setIcon(icon1)
self.toolButton_2.setIconSize(QtCore.QSize(96, 96))
self.toolButton_2.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
self.toolButton_2.setAutoRaise(True)
self.toolButton_2.setObjectName("toolButton_2")
self.toolButton_3 = QtWidgets.QToolButton(self.page)
self.toolButton_3.setGeometry(QtCore.QRect(0, 103, 120, 51))
icon2 = QtGui.QIcon()
icon2.addPixmap(QtGui.QPixmap("图标/03.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.toolButton_3.setIcon(icon2)
self.toolButton_3.setIconSize(QtCore.QSize(96, 96))
self.toolButton_3.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
self.toolButton_3.setAutoRaise(True)
self.toolButton_3.setObjectName("toolButton_3")
self.toolBox.addItem(self.page, "")
# 同学设置
self.page_2 = QtWidgets.QWidget()
self.page_2.setGeometry(QtCore.QRect(0, 0, 141, 287))
self.page_2.setObjectName("page_2")
self.toolButton_4 = QtWidgets.QToolButton(self.page_2)
self.toolButton_4.setGeometry(QtCore.QRect(0, 0, 120, 51))
icon3 = QtGui.QIcon()
icon3.addPixmap(QtGui.QPixmap("图标/04.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.toolButton_4.setIcon(icon3)
self.toolButton_4.setIconSize(QtCore.QSize(96, 96))
self.toolButton_4.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
self.toolButton_4.setAutoRaise(True)
self.toolButton_4.setObjectName("toolButton_4")
self.toolBox.addItem(self.page_2, "")
# 同事设置
self.page_3 = QtWidgets.QWidget()
self.page_3.setObjectName("page_3")
self.toolButton_5 = QtWidgets.QToolButton(self.page_3)
self.toolButton_5.setGeometry(QtCore.QRect(0, 1, 120, 51))
icon4 = QtGui.QIcon()
icon4.addPixmap(QtGui.QPixmap("图标/05.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.toolButton_5.setIcon(icon4)
self.toolButton_5.setIconSize(QtCore.QSize(96, 96))
self.toolButton_5.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
self.toolButton_5.setAutoRaise(True)
self.toolButton_5.setObjectName("toolButton_5")
self.toolButton_6 = QtWidgets.QToolButton(self.page_3)
self.toolButton_6.setGeometry(QtCore.QRect(0, 50, 120, 51))
icon5 = QtGui.QIcon()
icon5.addPixmap(QtGui.QPixmap("图标/06.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.toolButton_6.setIcon(icon5)
self.toolButton_6.setIconSize(QtCore.QSize(96, 96))
self.toolButton_6.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
self.toolButton_6.setAutoRaise(True)
self.toolButton_6.setObjectName("toolButton_6")
self.toolBox.addItem(self.page_3, "")
# 陌生人设置
self.page_4 = QtWidgets.QWidget()
self.page_4.setObjectName("page_4")
self.toolButton_7 = QtWidgets.QToolButton(self.page_4)
self.toolButton_7.setGeometry(QtCore.QRect(0, 7, 120, 51))
icon6 = QtGui.QIcon()
icon6.addPixmap(QtGui.QPixmap("图标/07.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.toolButton_7.setIcon(icon6)
self.toolButton_7.setIconSize(QtCore.QSize(96, 96))
self.toolButton_7.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
self.toolButton_7.setAutoRaise(True)
self.toolButton_7.setObjectName("toolButton_7")
self.toolBox.addItem(self.page_4, "")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
self.toolBox.setCurrentIndex(0) # 默认选择第一个页面,即我的好友
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "我的QQ"))
self.toolButton.setText(_translate("MainWindow", "宋江"))
self.toolButton_2.setText(_translate("MainWindow", "卢俊义"))
self.toolButton_3.setText(_translate("MainWindow", "吴用"))
self.toolBox.setItemText(self.toolBox.indexOf(self.page), _translate("MainWindow", "我的好友"))
self.toolButton_4.setText(_translate("MainWindow", "林冲"))
self.toolBox.setItemText(self.toolBox.indexOf(self.page_2), _translate("MainWindow", "同学"))
self.toolButton_5.setText(_translate("MainWindow", "鲁智深"))
self.toolButton_6.setText(_translate("MainWindow", "武松"))
self.toolBox.setItemText(self.toolBox.indexOf(self.page_3), _translate("MainWindow", "同事"))
self.toolButton_7.setText(_translate("MainWindow", "方腊"))
self.toolBox.setItemText(self.toolBox.indexOf(self.page_4), _translate("MainWindow", "陌生人"))
import sys
# 程序入口,程序从此处启动PyQt设计的窗体
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
ui = Ui_MainWindow() # 创建PyQt设计的窗体对象
ui.setupUi(MainWindow) # 调用PyQt窗体的方法对窗体对象进行初始化设置
MainWindow.setWindowFlags(QtCore.Qt.WindowCloseButtonHint) # 只显示“关闭”按钮
MainWindow.show() # 显示窗体
sys.exit(app.exec_()) # 程序关闭时退出进程
运行程序,分别单击ToolBox工具盒中的选项卡标题,即可进行切换显示,如图所示。
