容器控件可以将窗口中的控件进行分组处理,使窗口的分类更加清晰,常用的容器控件有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()获取指定选项卡的标题文本
  • 标题在上边

Pasted image 20250901153244

  • 标题在下边

Pasted image 20250901152938

  • 标题在左边

Pasted image 20250901153031

  • 标题在右边

Pasted image 20250901153130

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文件添加程序入口,然后运行程序,窗口中默认有两个选项卡,单击添加按钮,可以按顺序添加选项卡;单击删除按钮,可以删除当前鼠标焦点所在的选项卡,如图所示。

Pasted image 20250901152539

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

Pasted image 20250901152611

Info: 说明 当删除某个选项卡时,选项卡会自动切换到前一个,因此也会弹出相应的信息提示。

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工具盒中的选项卡标题,即可进行切换显示,如图所示。

Pasted image 20250901195730