20. 容器控件

一、容器控件

  容器类控件不能输入输出数据,通常作为常用控件的载体,将常用控件“放置”到其内部。容器控件对放到其内部的控件进行管理,并成为控件的父控件。

  我们可以在终端中使用 pip 安装 pyside6 模块。

pip install pyside6

二、分组框控件

  QGroupBox 控件,又称为分组框控件,它主要为其它控件提供分组,并且按照控件的分组来细分窗口的功能。 QGroupBox 通常带有一个边框和一个标题栏,标题栏上可以有勾选项,标题栏可以放到左边、中间或右边。布局时, QGroupBox 可用作一组控件的容器,内部使用布局控件进行布局。

  用 QGroupBox 创建对象的方法如下:

QGroupBox(parent:QWidget=None)
QGroupBox(title:str, parent:QWidget=None)

  其中,parent窗口 或者 容器 控件;title 是控件上 显示的文字,它是从 QWidget 类继承而来的。

  QGroupBox 类的常用方法如下:

# 实例方法
setTitle(title:str) -> None                             # 设置标题
title() -> str                                          # 获取标题
setFlat(flat:bool) -> None                              # 设置是否处于扁平状态
isFlat() -> bool                                        # 获取是否处于扁平状态
setCheckable(checkable:bool) -> None                    # 设置是否有勾选框
isCheckable() -> bool                                   # 获取是否有勾选框
isChecked() -> bool                                     # 获取勾选项是否处于勾选状态
setAlignment(alignment:Qt.AlignmentFlag) -> None        # 设置对齐方式
alignment() -> Qt.AlignmentFlag                         # 获取对齐方式

# 槽函数
setChecked(checked:bool) -> None                        # 设置勾选项是否处于勾选状态

  用 setAlignment(Q.Alignment) 方法可以设置标题栏的对齐位置,其中参数 Qt.Alignment 可以取 Qt.AlignLeftQt.AlignRightQt.AlignHCenter,分别表示把标题栏放到左边、右边和中间;

  QGroupBox 控件常用信号及其说明如下:

clicked(checked=false)          # 被点击时发射信号
toggled(arg__1:bool)            # 切换时发射信号

  创建分组框控件后,如果要往分组框中添加其他控件,可以在创建控件对象时将其 parent 参数设置成 QGroupBox 的实例对象,或者用控件的 setParent(QWidget) 方法设置控件所在的容器。也可以先创建布局,将控件放到布局中,然后用分组框的 setLayout(QLayout) 方法将布局添加到分组框中。

import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QGroupBox
from PySide6.QtWidgets import QPushButton, QHBoxLayout
from PySide6.QtCore import Qt

class MyWidget(QWidget):
    def __init__(self):
        # 1.调用父类Qwidget类的__init__()方法
        super().__init__()
        # 2.调用setupUi()方法初始化页面
        self.setup_ui()

    def setup_ui(self):
        # 1.设置窗口对象大小
        self.resize(700, 500)

        # 2.创建分组框控件对象
        groupBox = QGroupBox(self)
        groupBox.resize(300, 100)

        # 3.设置对齐方式
        groupBox.setAlignment(Qt.AlignmentFlag.AlignVCenter)

        # 4.设置分组标题
        groupBox.setTitle("分组标题")

        # 5.设置是否以扁平样式显示
        groupBox.setFlat(False)

        # 6.创建布局控件
        layout = QHBoxLayout(groupBox)

        # 7.创建按钮控件
        button_1 = QPushButton("按钮1")
        button_2 = QPushButton("按钮2")

        # 8.将按钮控件添加到布局中
        layout.addWidget(button_1)
        layout.addWidget(button_2)

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2.创建一个窗口
    window = MyWidget()
    # 3.展示窗口
    window.show()
    # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

三、框架控件

  框架控件 QFrame 作为容器,可以在其内部放置各种可视控件。但是 QFrame 没有属于自己特有的信号和槽函数,一般不接受用户的输入,它只能提供一个外形,可以设置外形的样式、线宽等。QFrame 作为父类,被其他一些控件所继承,这些控件如 QAbstractScrollArea、QLabel、QLCDNumber、QSplitter、QStackedWidget 和 QToolBox 等。

  框架控件 QFrame 是从 QWidget 类继承而来的。用 QFrame 创建实例对象的常用方法如下所示:

QFrame(parent:QWidget=None, f:Qt.WindowFlags=Default(Qt.WindowFlags))

  其中 parent窗口 或者 容器 类控件,f 用于 设置控件的窗口类型

  框架控件 QFrame 的常用方法如下:

setFrameShadow(arg__1:QFrame.Shadow) -> None            # 设置QFrame窗口的阴影形状
frameShadow() -> QFrame.Shadow                          # 获取QFrame窗口的阴影形状
setFrameShape(arg__1:QFrame.Shape) -> None              # 设置QFrame窗口的边框形状
frameShape() -> QFrame.Shape                            # 获取QFrame窗口的边框形状
setFrameStyle(arg__1:int) -> None                       # 设置QFrame窗口的边框样式
frameStyle() -> int                                     # 获取QFrame窗口的边框样式
setLineWidth(arg__1:int) -> None                        # 设置QFrame窗口的边框宽度
lineWidth() -> int                                      # 获取QFrame窗口的边框宽度
setMidLineWidth(arg__1:int) -> None                     # 设置QFrame窗口的中间边框宽度
midLineWidth() -> int                                   # 获取QFrame窗口的中间边框宽度
frameWidth() -> int                                     # 获取QFrame窗口的边框宽度
setFrameRect(arg__1:QRect) -> None                      # 设置QFrame窗口的边框矩形
frameRect() -> QRect                                    # 获取QFrame窗口的边框矩形
drawFrame(arg__1:QPainter) -> None                      # 绘制QFrame窗口边框线
setLayout(arg__1:QLayout) -> None                       # 设置QFrame窗口的布局
setGeometry(arg__1:QRect) -> None                       # 设置QFrame窗口的位置和大小
setGeometry(x:int, y:int, w:int, h:int) -> None         # 设置QFrame窗口的位置和大小
resize(arg__1:QSize) -> None                            # 设置QFrame窗口的大小
resize(w:int, h:int) -> None                            # 设置QFrame窗口的大小

  框架主要由边框线构成,边框线由外线、内线和中间线构成。外线和内线的宽度可以通过 setLineWidth(int) 方法设置,中间线宽度可以通过 setMidLineWidth(int) 方法设置,外线和内线的宽度通过 lineWidth() 方法获取,中间线的宽度通过 midLineWidth() 方法获取,外线、内线和中间线宽度通过 frameWidth() 方法获取。

  通过给边框的内线、外线设置不同的颜色,可以让外框有凸起和凹陷的立体感觉。用 setFrameShadow(QFrame.Shadow) 方法设置边框线的立体感觉,参数 QFrame.Shadow 可以取值如下:

QFrame.Shadow.Plain       # 平面
QFrame.Shadow.Raised      # 凸起
QFrame.Shadow.Sunken      # 凹陷

  外框线的形状通过 setFrameShape(QFrame.Shape) 方法设置,其中参数 QFrame.Shape 是枚举类型,可取值如下所示:

QFrame.Shape.NoFrame           # 无边框,默认值
QFrame.Shape.Box               # 矩形框,边框线内部不填充
QFrame.Shape.Panel             # 面板,边框线内部填充
QFrame.Shape.WinPanel          # Windows2000风格的面板,边框线的宽度是2像素
QFrame.Shape.HLine             # 边框线只在中间有一条水平线,用作分隔线
QFrame.Shape.VLine             # 边框线只在中间有一条垂直线,用作分隔线
QFrame.Shape.StyledPanel       # 依据当前GUI类型,画一个矩形面板

  QFrame 的 frameStyle 属性由 frameShadow 属性和 frameShape 属性决定,因此设置 frameShadow 和 frameShape 的值,就不需要再设置 frameStyle 的值了。将以上参数进行组合可以得到不同感觉的边框线。

import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QFrame
from PySide6.QtWidgets import QPushButton, QHBoxLayout

class MyWidget(QWidget):
    def __init__(self):
        # 1.调用父类Qwidget类的__init__()方法
        super().__init__()
        # 2.调用setupUi()方法初始化页面
        self.setup_ui()

    def setup_ui(self):
        # 1.设置窗口对象大小
        self.resize(700, 500)

        # 2.创建分组框控件对象
        frame = QFrame(self)
        frame.resize(300, 100)

        # 3.创建布局控件
        layout = QHBoxLayout(frame)

        # 4.创建按钮控件
        button_1 = QPushButton("按钮1")
        button_2 = QPushButton("按钮2")

        # 5.将按钮控件添加到布局中
        layout.addWidget(button_1)
        layout.addWidget(button_2)

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2.创建一个窗口
    window = MyWidget()
    # 3.展示窗口
    window.show()
    # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

四、滚动区控件

  滚动区控件 QScrollArea 作为其他控件的容器,当其内部的控件超过滚动区的尺寸时,滚动区自动提供水平或竖直滚动条,通过拖动滚动条的位置,用户可以看到内部所有控件的内容。

  用 QScrollArea 类创建实例对象的方法如下所示:

QScrollArea(parent:QWidget=None)

  其中 parent窗口 或者 容器 类控件,它是从抽象类QAbstractScrollArea继承而来的。

  QScrollArea 类的常用方法如下:

setWidget(widget:QWidget) -> None                                               # 将某个控件设置成可滚动显示的控件
widget() -> QWidget                                                             # 获取可滚动显示的控件
setWidgetResizable(resizable:bool) -> None                                      # 设置内部控件是否可调节尺寸,尽量不显示滚动条
widgetResizable() -> bool                                                       # 获取内部控件是否可以调节尺寸
setAlignment(arg__1:Qt.Alignment) -> None                                       # 设置内部控件在滚动区的控件对齐方式
alignment() -> Qt.Alignment                                                     # 获取内部控件在滚动区的控件对齐方式
ensureVisible(x:int, y:int, xmargin:int=50, ymargin:int=50) -> None             # 自动移动滚动条的位置,确保(x, y)像素点是可见的。可见时,点到边框的距离时间为xmargin和ymargin,默认值是50
ensureWidgetVisible(childWidget:QWidget, xmargin:int=50, ymargin:int=50)        # 自动移动滚动条的位置,确保控件childWidget是可见的
setHorizontalScrollBarPolicy(arg__1:Qt.ScrollBarPolicy) -> None                 # 设置水平滚动条的显示策略
setVerticalScrollBarPolicy(arg__1:Qt.ScrollBarPolicy) -> None                   # 设置垂直滚动条的显示策略

  必须用 setWidget(QWidget) 方法将某个控件设置成可滚动显示的控件,只有当该控件移出了滚动区控件的窗口,才能用滚动条移动控件。

  用 setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy) 方法和 setVerticalScrollBarPolicy(Qt.ScrollBarPolicy) 方法设置竖直滚动条和水平滚动条出现的策略,其中参数 Qt.ScrollBarPolicy 可以取值如下:

Qt.ScrollBarPolicy.ScrollBarAsNeeded     # 根据情况自动决定何时出现滚动条
Qt.ScrollBarPolicy.ScrollBarAlwaysOff    # 从不出现滚动条
Qt.ScrollBarPolicy.ScrollBarAlwaysOn     # 一直出现滚动条

  ensureVisible(x,y,xmargin=50,ymargin=50) 方法和 ensureWidgetVisible(childWidget,xmargin=50,ymargin=50) 方法可以确保某个点或某个控件是可见的,如果无法使其可见,将会使距其最近的有效点可见。当点或控件可见时,点或控件距离边界的位置是 xmargin 和 ymargin。

import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QScrollArea, QHBoxLayout
from PySide6.QtWidgets import QLabel
from PySide6.QtGui import QPixmap, Qt

class MyWidget(QWidget):
    def __init__(self):
        # 1.调用父类Qwidget类的__init__()方法
        super().__init__()
        # 2.调用setupUi()方法初始化页面
        self.setup_ui()

    def setup_ui(self):
        # 1.设置窗口对象大小
        self.resize(700, 500)

        # 2.创建滚动区域控件
        scrollArea = QScrollArea(self)

        # 3.设置标签的宽度和高度
        label = QLabel(self)
        pixmap = QPixmap("1.jpg")
        label.resize(pixmap.width(), pixmap.height())
        label.setPixmap(pixmap)

        # 4.设置可滚动显示控件
        scrollArea.setWidget(label)

        # 5.设置对齐方式
        scrollArea.setAlignment(Qt.AlignmentFlag.AlignCenter)

        # 6.设置可见点
        scrollArea.ensureVisible(150, 100)

        # 7.设置显示策略
        scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
        scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)

        # 8.添加布局
        layout = QHBoxLayout(self)
        layout.addWidget(scrollArea)

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2.创建一个窗口
    window = MyWidget()
    # 3.展示窗口
    window.show()
    # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

五、选项卡控件

  QTabWidget 控件,又称为选项卡控件,它可以将窗口设置为多页,每页卡片就是一个窗口(QWidget),以便使窗口的功能划分为多个部分,而每个部分都可以包含多个子控件。当无法显示全部卡片时,可单击右上角显示滚动按钮。

  用 QTabWidget 类创建实例对象的方法如下所示:

QTabWidget(parent:QWidget=None)

  其中 parent窗口 或者 容器 类控件。

  该类的常用方法如下:

# 实例方法
addTab(widget:QWidget, label:str) -> int                                    # 在末尾添加新卡片
addTab(widget:QWidget, icon:QIcon, label:str) -> int                        # 在末尾添加新卡片
insertTab(index:int, widget:QWidget, label:str) -> int                      # 在指定位置插入新卡片
insertTab(index:int, widget:QWidget, icon:QIcon, label:str) -> int          # 在指定位置插入新卡片
widget(index:int) -> QWidget                                                # 获取指定位置的卡片
clear() -> None                                                             # 清空卡片
count() -> int                                                              # 获取卡片数量
indexOf(widget:QWidget) -> int                                              # 获取窗口对应的卡片索引号
removeTab(index:int) -> None                                                # 删除指定位置的卡片

setCornerWidget(w:QWidget, corner:Qt.Corner=Qt.TopRightCorner) -> None      # 在角上设置控件
cornerWidget(corner:Qt.Corner=Qt.TopRightCorner) -> QWidget                 # 获取角位置处的控件
currentIndex() -> int                                                       # 获取当前卡片索引号
currentWidget() -> QWidget                                                  # 获取当前卡片
setDocumentMode(set:bool) -> None                                           # 设置卡片是否为文档模式
documentMode() -> bool                                                      # 获取卡片是否为文档模式
setElideMode(mode:Qt.TextElideMode) -> None                                 # 设置卡片标题是否为省略模式
setMovable(movable:bool) -> None                                            # 设置卡片是否可移动
isMovable() -> bool                                                         # 获取卡片是否可移动
setTabBarAutoHide(enabled:bool) -> None                                     # 设置卡片是否自动隐藏标签栏
tabBarAutoHide() -> bool                                                    # 获取卡片是否自动隐藏标签栏
setTabEnabled(index:int, enabled:bool) -> None                              # 设置是否将索引为index的卡片激活
isTabEnabled(index:int) -> bool                                             # 获取索引为index的卡片是否激活
setTabIcon(index:int, icon:QIcon) -> None                                   # 设置索引为index的卡片图标
tabIcon(index:int) -> QIcon                                                 # 获取索引为index的卡片图标
setIconSize(size:QSize) -> None                                             # 设置图标大小   
iconSize() -> QSize                                                         # 获取图标大小
setTabPosition(position:QTabWidget.TabPosition) -> None                     # 设置标题栏的位置 
setTabShape(s:QTabWidget.TabShape) -> None                                  # 设置标题栏的形状
setTabText(index:int, text:str) -> None                                     # 设置索引为index的卡片标题
tabText(index:int) -> str                                                   # 获取索引为index的卡片标题
setTabToolTip(index:int, tip:str) -> None                                   # 设置索引为index的卡片提示
tabToolTip(index:int) -> str                                                # 获取索引为index的卡片提示
setTabsClosable(closeable:bool) -> None                                     # 设置卡片是否可关闭
tabsClosable() -> bool                                                      # 获取卡片是否可关闭
setUsesScrollButtons(useButtons:bool) -> None                               # 设置是否使用滚动按钮
usesScrollButtons() -> bool                                                 # 获取是否使用滚动按钮

# 槽函数
setCurrentIndex(index:int) -> None                                          # 根据索引设置为当前卡片
setCurrentWidget(widget:QWidget) -> None                                    # 将窗口控件widget设置为当前卡片

  切换卡的每页卡片都是一个窗口(QWidget)或者从 QWidget 继承的可视化子类,因此添加卡片时,需要实例化的 QWidget。QTabWidget 添加卡片的方法是 addTab(QWidget,label:str)addTab(QWidget,QIcon,label:str) ,其中, QWidget 是继承自 QWidget 的实例;label 是卡片标题的名称,可以在名称中添加 “&” 和字母设置快捷键;QIcon 是卡片的图标,卡片的索引从 0 开始。在某个位置插入卡片用 insertTab(index:int,QWidget,label:str)insertTab(index:int,QWidget,QIcon,str) 方法;删除所有卡片用 clear() 方法;删除索引号是 index 的卡片用 removeTab(index:int) 方法;卡片标题可以用 setTabText(index:int,str) 方法设置,其中参数 index 是卡片的索引。

  卡片标题栏可以放到上、下、左、右位置,卡片标题的位置用 setTabPosition(QTabWidget.TabPosition) 方法设置,其中参数 QTabWidget.TabPosition 可以取值如下:

QTabWidget.TabPosition.North      # 上
QTabWidget.TabPosition.South      # 下
QTabWidget.TabPosition.West       # 左
QTabWidget.TabPosition.East       # 右 

  卡片标题栏的形状用 setTabShape(QTabWidget.TabShape) 方法定义,其中参数 QTabWidget.TabShape可以取值如下:

QTabWidget.TabShape.Rounded       # 圆角
QTabWidget.TabShape.Triangular    # 三角形

  如果显示标题栏文字的空间不足,可以用省略号来表示。用 setElideMode(Qt.TextElideMode) 方法设置卡片标题栏文字在显示空间不足时的省略号显示方式,其中参数 Qt.TextElideMode 可以取值如下:

Qt.TextElideMode.ElideNone       # 没有省略号
Qt.TextElideMode.ElideLeft       # 省略号在左边
Qt.TextElideMode.ElideMiddle     # 省略号在中间
Qt.TextElideMode.ElideRight      # 省略号在右边

  每页卡片显示时,默认为有框架并呈立体形状显示在父窗口上。用 setDocumentMode(bool) 方法设置卡片是否有框架,如果没有框架,则卡片上内容与父窗口看起来是一个整体。

  用 setCornerWidget(QWidget,Qt.Corner) 方法可以在 QTabWidget 的右上角、右下角、左上角和左下角处放置控件,例如放置标签、单击按钮等,其中参数 Qt.Corner 可以取值如下:

Qt.Corner.TopRightCorner
Qt.Corner.BottomRightCorner
Qt.Corner.TopLeftCorner
Qt.Corner.BottomLeftCorner

  用 setTabBarAutoHide(bool) 方法可以设置当只有 1 张卡片时,卡片标题是否自动隐藏。

  QTabWidge 控件最常用的信号及其说明如下:

currentChanged(index:int)           # 标签栏上的选项卡改变时发射信号
tabBarClicked(index:int)            # 标签栏被点击时发射信号
tabBarDoubleClicked(index:int)      # 标签栏被双击时发射信号
tabCloseRequested(index:int)        # 标签栏被关闭时发射信号
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QTabWidget
from PySide6.QtGui import QIcon

class MyWidget(QWidget):
    def __init__(self):
        # 1.调用父类Qwidget类的__init__()方法
        super().__init__()
        # 2.调用setupUi()方法初始化页面
        self.setup_ui()

    def setup_ui(self):
        # 1.设置窗口对象大小
        self.resize(700, 500)

        # 2.创建选项卡控件对象
        tabWidget = QTabWidget(self)
        tabWidget.setGeometry(100, 100, 500, 300)

        # 3.添加选项卡
        tab_1 = QWidget()
        tabWidget.addTab(tab_1, QIcon("1.ico"), "选项卡1")

        # 4.插入选项卡
        tab_2 = QWidget()
        tabWidget.insertTab(1, tab_2, QIcon("1.ico"), "选项卡2")

        tab_3 = QWidget()
        tabWidget.addTab(tab_3, "选项卡-3")

        # 5.设置指定选项卡标题文本
        tabWidget.setTabText(2, "选项卡3")

        # 6.设置指定索引选项卡图标
        tabWidget.setTabIcon(2, QIcon("1.ico"))

        # 7.设置是否可以独立关闭选项卡
        tabWidget.setTabsClosable(True)

        # 8.设置选项卡的标题位置
        tabWidget.setTabPosition(QTabWidget.TabPosition.North)

        # 9.设置默认选中的选项卡
        # tabWidget.setCurrentIndex(1)
        tabWidget.setCurrentWidget(tab_2)

        # 14.获取当前选中选项卡索引
        print(tabWidget.currentIndex())

        # 15.定义信号与槽的连接
        tabWidget.currentChanged.connect(self.currentChanged)
        tabWidget.tabBarClicked.connect(self.tabBarClicked)
        tabWidget.tabBarDoubleClicked.connect(self.tabBarDoubleClicked)
        tabWidget.tabCloseRequested.connect(self.tabCloseRequested)

    def currentChanged(self, index):
        print("选项卡被切换了,切换后的选项卡索引为:", index)

    def tabBarClicked(self, index):
        print("当前选项卡的标题被单击了,索引为:", index)

    def tabBarDoubleClicked(self, index):
        print("当前选项卡的标题被双击了,索引为:", index)

    def tabCloseRequested(self, index):
        print(f"索引为【{index}】的选项卡被关闭了")

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2.创建一个窗口
    window = MyWidget()
    # 3.展示窗口
    window.show()
    # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

TabWidge 在显示选项卡时,如果默认大小显示不下,会自动生成先前和先后的箭头,用户可以通过单击箭头,查看未显示的选项卡;

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

六、栈控件

  控件栈控件 QStackedWidget 与 QTabWidget 在功能上有些相似。控件栈也是包含多个窗口的控件,但是与 QTabWidget 不同的是,控件栈不是通过卡片管理窗口控件,而是根据需要从多个控件中选择某个窗口作为当前窗口,当前窗口是要显示的窗口,而不是当前的窗口不显示。

  QStackedWidget 类是从 QFrame 继承而来的。用 QStackedWidget 类创建实例对象的方法如下所示:

QStackedWidget(parent:QWidget=None)

  其中 parent窗口 或者 容器 类控件。

  QStackedWidget 类的常用方法如下:

# 实例方法
addWidget(w:QWidget) -> int                     # 在末尾添加窗口,并返回索引值
insertWidget(index:int, w:QWidget) -> int       # 在指定索引位置添加窗口
widget(index:int) -> QWidget                    # 获取指定索引值的窗口
removeWidget(w:QWidget) -> None                 # 删除窗口
currentIndex() -> int                           # 获取当前索引值
currentWidget() -> QWidget                      # 获取当前窗口
indexOf(w:QWidget) -> int                       # 获取指定窗口的索引值
count() -> int                                  # 获取窗口数量

# 槽函数
setCurrentIndex(index:int) -> None              # 将索引值为index的窗口设置为当前窗口
setCurrentWidget(w:QWidget) -> None             # 将指定的窗口设置当前窗口

  QStackedWidget 控件最常用的信号及其说明如下:

currentChanged(index:int)           # 窗口改变时发射信号
widgetRemoved(index:int)            # 窗口被移除时发射信号
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QStackedWidget
from PySide6.QtWidgets import QLabel, QPushButton
from PySide6.QtWidgets import QHBoxLayout, QVBoxLayout
from PySide6.QtGui import QPixmap

class MyWidget(QWidget):
    def __init__(self):
        # 1.调用父类Qwidget类的__init__()方法
        super().__init__()
        # 2.调用setupUi()方法初始化页面
        self.setup_ui()

    def setup_ui(self):
        # 1.设置窗口对象大小
        self.resize(700, 500)

        # 2.创建选项卡控件对象
        self.stackedWidget = QStackedWidget(self)
        self.stackedWidget.setGeometry(100, 100, 500, 300)

        # 3.创建布局
        layout_V = QVBoxLayout(self)
        layout_V.addWidget(self.stackedWidget)
        layout_H = QHBoxLayout()
        layout_V.addLayout(layout_H)

        # 4.创建按钮对象
        button_1 = QPushButton("上一个")
        button_2 = QPushButton("下一个")
        button_3 = QPushButton("删除窗口")
        layout_H.addWidget(button_1)
        layout_H.addWidget(button_2)
        layout_H.addWidget(button_3)

        # 5.添加窗口控件
        widget_1 = QWidget()
        label_1 = self.label_image("1.jpg", widget_1)
        self.stackedWidget.addWidget(widget_1)

        # 6.插入选项卡
        widget_2 = QWidget()
        self.label_image("2.jpeg", widget_2)
        self.stackedWidget.insertWidget(1, widget_2)

        widget_3 = QWidget()
        self.label_image("3.jpeg", widget_3)
        self.stackedWidget.addWidget(widget_3)

        # 7.设置默认选中的选项卡
        self.stackedWidget.setCurrentIndex(1)
        # stackedWidget.setCurrentWidget(widget_2)

        # 8.获取当前选中选项卡索引
        self.num = self.stackedWidget.currentIndex()

        # 9.定义信号与槽的连接
        button_1.clicked.connect(self.privious_window)
        button_2.clicked.connect(self.next_window)
        button_3.clicked.connect(self.delete_window)
        self.stackedWidget.currentChanged.connect(self.currentChanged)
        self.stackedWidget.widgetRemoved.connect(self.widgetRemoved)

    def label_image(self, image=None, parent=None):
        if image:
            pixmap = QPixmap(image)
            label = QLabel(parent)
            label.resize(pixmap.width(), pixmap.height())
            label.setPixmap(pixmap)
            return label

    def privious_window(self):
        print("你点击了上一个按钮")
        self.num -= 1
        self.num = self.stackedWidget.count() - 1 if self.num < 0 else self.num
        self.stackedWidget.setCurrentIndex(self.num)
        self.num = self.stackedWidget.currentIndex()

    def next_window(self):
        print("你点击了下一个按钮")
        self.num += 1
        self.num = 0 if self.num > self.stackedWidget.count() - 1 else self.num
        self.stackedWidget.setCurrentIndex(self.num)
        self.num = self.stackedWidget.currentIndex()

    def delete_window(self):
        print("你点击了删除窗口按钮")
        widget = self.stackedWidget.currentWidget()
        self.stackedWidget.removeWidget(widget)
        self.num = self.stackedWidget.currentIndex()

    def currentChanged(self, index):
        print("窗口被切换了,切换后的窗口索引为:", index)

    def widgetRemoved(self, index):
        print(f"索引为【{index}】的窗口被关闭了")

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2.创建一个窗口
    window = MyWidget()
    # 3.展示窗口
    window.show()
    # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

七、工具盒控件

  工具箱控件 QToolBox 与切换卡控件 QTabWidget 有些类似,也是由多页构成,每页有标题名称。与切换卡不同的是,工具箱的标题是从上到下依次排列,每页的标题呈按钮状态,单击每页的标题,每页的窗口会显示在标题按钮下面;而切换卡的标题是按顺序展开,切换卡的标题面积比卡片窗口的面积小。

  QToolBox 是从 QFrame 类继承而来的。用 QToolBox 类创建实例对象的方法如下所示:

QToolBox(parent:QWidget=None, f:Qt.WindowFlags=Default(Qt.WindowFlags))

  其中 parent窗口 或者 容器 类控件,参数 Qt.WindowFlags 用于 设置窗口类型,默认值是 Qt.Widget

  QToolBox 类的常用方法如下:

# 实例方法
addItem(widget:QWidget, text:str) -> int                                # 在末尾添加项
addItem(widget:QWidget, icon:QIcon, text:str) -> int                    # 在末尾添加项
insertItem(index:int, widget:QWidget, text:str) -> int                  # 在指定位置插入项
insertItem(index:int, widget:QWidget, icon:QIcon, text:str) -> int      # 在指定位置插入项
widget(index:int) -> QWidget                                            # 获取指定位置的项
removeItem(index:int) -> None                                           # 删除指定位置的项
currentIndex() -> int                                                   # 获取当前选中的的项的索引
currentWidget() -> QWidget                                              # 获取当前选中的项
count() -> int                                                          # 获取项的数量
indexOf(widget:QWidget) -> int                                          # 获取指定项的索引

setItemEnabled(index:int, enabled:bool) -> None                         # 设置指定位置的项是否被激活
isItemEnabled(index:int) -> bool                                        # 获取指定位置的项是否被激活
setItemIcon(index:int, icon:QIcon) -> None                              # 设置指定位置的项的图标
itemIcon(index:int) -> QIcon                                            # 获取指定位置的项的图标
setItemText(index:int, text:str) -> None                                # 设置指定位置的项的文本
itemText(index:int) -> str                                              # 获取指定位置的项的文本
setItemToolTip(index:int, toolTip:str) -> None                          # 设置指定位置的项的提示文本
itemToolTip(index:int) -> str                                           # 获取指定位置的项的提示文本

# 槽方法
setCurrentIndex(index:int) -> None                                      # 根据索引设置当前选中的项
setCurrentWidget(widget:QWidget) -> None                                # 根据指定窗口设置当前选中的项

  QToolBox 控件常用信号及其说明如下:

currentChanged(index)       # 当前项改变时发射信号
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QToolBox
from PySide6.QtGui import QIcon

class MyWidget(QWidget):
    def __init__(self):
        # 1.调用父类Qwidget类的__init__()方法
        super().__init__()
        # 2.调用setupUi()方法初始化页面
        self.setup_ui()

    def setup_ui(self):
        # 1.设置窗口对象大小
        self.resize(700, 500)

        # 2.创建工具盒控件对象,并指定父窗口
        self.toolBox = QToolBox(self)

        # 3.设置工具盒框控件的位置和尺寸
        self.toolBox.setGeometry(100, 100, 500, 300)

        # 4.添加选项卡
        self.toolBox.addItem(QWidget(), QIcon("1.ico"), "科技部")

        # 5.向指定索引插入选项卡
        page = QWidget()
        self.toolBox.insertItem(1, page, QIcon("1.ico"), "魔法部")

        self.toolBox.addItem(QWidget(), "奇异部")
        self.toolBox.addItem(QWidget(), QIcon("1.ico"), "侦探部")

        # 6.设置指定索引的文本
        self.toolBox.setItemText(2, "超能力部")

        # 7.获取指定索引的选项卡的文本
        print(self.toolBox.itemText(2))

        # 8.获取指定指定索引的图标
        icon = self.toolBox.itemIcon(0)

        # 9.设置指定索引的图标
        self.toolBox.setItemIcon(2, icon)

        # 10.设置默认选中的选项卡
        # toolBox.setCurrentWidget(page)
        self.toolBox.setCurrentIndex(1)

        # 11.获取当前选项卡的索引
        print(self.toolBox.currentIndex())

        # 12.定义信号与槽的连接
        self.toolBox.currentChanged.connect(self.currentChanged)

    def currentChanged(self, index):
        print("项被切换了")
        print("切换后的项的索引为:", index)
        print("切换后的项的名称为:", self.toolBox.itemText(index))

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2.创建一个窗口
    window = MyWidget()
    # 3.展示窗口
    window.show()
    # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())
posted @   星光映梦  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示