悠闲博客-blog.yxrjt.cn

手把手教你学习PyQT5:789PyQt5高级控件789

更新时间:2025-09-28 18:24点击:54

‌七、PyQt5高级控件(滑块控件、计数器控件、树控件、QtabWidget)

7-1、滑块控件

滑块控件(Slider)是图形用户界面中常见的一种控件,也称为滑杆、拖动条、进度条等,用于调节数值类型的参数。用户通过拖动滑块的滑块块(Thumb)来改变滑块的值,滑块的范围和步长可以通过设置属性进行控制。在PyQt5中,QSlider是用于创建滑块控件的类。


QSlider的常用属性和方法如下:


value():获取当前滑块的值。

setValue(value):设置当前滑块的值。

minimum():获取滑块的最小值。

setMinimum(value):设置滑块的最小值。

maximum():获取滑块的最大值。

setMaximum(value):设置滑块的最大值。

singleStep():获取滑块的步长。

setSingleStep(value):设置滑块的步长。

sliderMoved.connect(slot):将slot函数连接到滑块拖动事件。

valueChanged.connect(slot):将slot函数连接到滑块值改变事件。

在使用QS

简单案例分析:


该综合案例创建了一个带有滑块控件的窗口,并实现了滑块值的更新和重置按钮的功能。运行该代码将显示一个带有滑块控件和重置按钮的窗口,当滑块的值改变时,标签的文本会更新为当前的滑块值。点击重置按钮将会将滑块的值重置为0,并更新标签的文本。


import sys

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSlider, QHBoxLayout, QVBoxLayout, QPushButton

from PyQt5.QtCore import Qt



class SliderDemo(QWidget):

    def __init__(self):

        super().__init__()

        self.initUI()


    def initUI(self):

        # 创建一个水平布局和垂直布局

        hlayout = QHBoxLayout()

        vlayout = QVBoxLayout()


        # 创建一个标签和滑块控件,并添加到水平布局中

        self.label = QLabel('Value: 0')

        self.slider = QSlider(Qt.Horizontal)

        self.slider.valueChanged[int].connect(self.onSliderValueChanged)

        hlayout.addWidget(self.label)

        hlayout.addWidget(self.slider)


        # 创建一个重置按钮,并添加到垂直布局中

        reset_btn = QPushButton('Reset')

        reset_btn.clicked.connect(self.onResetBtnClicked)

        vlayout.addLayout(hlayout)

        vlayout.addWidget(reset_btn)


        # 设置窗口的布局

        self.setLayout(vlayout)


        # 设置窗口的标题和大小

        self.setWindowTitle('Slider Demo')

        self.resize(300, 200)


    def onSliderValueChanged(self, value):

        # 当滑块的值改变时更新标签的文本

        self.label.setText(f'Value: {value}')


    def onResetBtnClicked(self):

        # 重置滑块的值为0,并更新标签的文本

        self.slider.setValue(0)

        self.label.setText('Value: 0')



if __name__ == '__main__':

    app = QApplication(sys.argv)

    demo = SliderDemo()

    demo.show()

    sys.exit(app.exec_())



输出如下图所示:

在这里插入图片描述


7-2、计数器(QSpinBox)控件

QSpinBox是PyQt5中的一个计数器控件,它提供了一个可供用户编辑和选择数字的文本框,用户可以通过点击上下箭头或直接输入数字来更改文本框中的值。


以下是一些QSpinBox控件的常用属性和方法:


value():返回当前计数器的值

setValue(value):设置计数器的值

minimum():返回计数器的最小值

setMinimum(value):设置计数器的最小值

maximum():返回计数器的最大值

setMaximum(value):设置计数器的最大值

singleStep():返回计数器的单步增量

setSingleStep(value):设置计数器的单步增量

suffix():返回计数器的后缀

setSuffix(suffix):设置计数器的后缀

以下为简单案例分析:


该示例程序创建了一个带有计数器控件、标签和重置按钮的窗口。当计数器的值更改时,标签的文本会更新为当前计数器的值。当用户点击重置按钮时,计数器的值将重置为默认值0。运行该程序,将会显示一个带有计数器控件、标签和重置按钮的窗口,您可以通过点击上下箭头或直接输入数字来更改计数器的值,也可以点击重置按钮将计数器的值重置为0。


import sys

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSpinBox, QPushButton, QVBoxLayout, QHBoxLayout

from PyQt5.QtCore import Qt



class CounterDemo(QWidget):

    def __init__(self):

        super().__init__()

        self.initUI()


    def initUI(self):

        # 创建一个垂直布局

        vlayout = QVBoxLayout()


        # 创建一个标签和计数器控件,并添加到垂直布局中

        self.label = QLabel('Value: 0')

        self.spinbox = QSpinBox()

        self.spinbox.setMinimum(0)

        self.spinbox.setMaximum(100)

        self.spinbox.setSingleStep(1)

        self.spinbox.valueChanged[int].connect(self.onSpinBoxValueChanged)

        vlayout.addWidget(self.label)

        vlayout.addWidget(self.spinbox)


        # 创建一个水平布局,并添加一个重置按钮

        hlayout = QHBoxLayout()

        reset_btn = QPushButton('Reset')

        reset_btn.clicked.connect(self.onResetClicked)

        hlayout.addWidget(reset_btn)

        hlayout.addStretch(1)

        vlayout.addLayout(hlayout)


        # 设置窗口的布局

        self.setLayout(vlayout)


        # 设置窗口的标题和大小

        self.setWindowTitle('Counter Demo')

        self.resize(300, 200)


    def onSpinBoxValueChanged(self, newValue):

        # 当计数器的值改变时更新标签的文本

        self.label.setText(f'Value: {newValue}')


    def onResetClicked(self):

        # 点击重置按钮时将计数器的值重置为默认值0

        self.spinbox.setValue(0)



if __name__ == '__main__':

    app = QApplication(sys.argv)

    demo = CounterDemo()

    demo.show()

    sys.exit(app.exec_())



···

在这里插入图片描述

7-3、树(Tree Widget)控件

7-3-1、树控件的简单介绍

树控件(Tree Widget)是一种常见的用户界面控件,它可以用来展示层次化的数据结构,例如文件系统、目录结构、组织结构等等。树控件通常由多个节点(Node)组成,每个节点都可以包含多个子节点。


在PyQt5中,树控件是通过QTreeWidget类来实现的。下面是一些常用的树控件相关的概念:


节点(Node):树控件中的基本元素,可以包含多个子节点。每个节点通常由一个图标、一段文本和一个可选的复选框组成。节点可以通过QTreeWidgetItem类来创建和操作。

根节点(Root Node):树控件中的最顶层节点,它没有父节点。一个树控件通常只有一个根节点,但也可以有多个根节点。

子节点(Child Node):节点的直接下级节点。

父节点(Parent Node):节点的直接上级节点。根节点没有父节点。

叶节点(Leaf Node):没有子节点的节点。

复选框(Checkbox):树控件中每个节点可以包含一个可选的复选框,用来表示节点的选中状态。

项数据(Item Data):每个节点都可以包含多个数据项,例如文本、图标、颜色等等。这些项数据可以通过QTreeWidgetItem.setData()和QTreeWidgetItem.data()方法来设置和获取。

展开(Expand):将一个节点的所有子节点显示出来。

折叠(Collapse):将一个节点的所有子节点隐藏起来。

树控件通常具有以下特点:


层次化结构:树控件中的节点可以是多层次的,可以有多个父节点和多个子节点。

可扩展性:树控件中的节点可以被动态地添加和删除,可以根据需要展开或折叠节点。

交互性:用户可以通过单击节点或复选框来选择或取消选择节点,可以通过双击节点或者右键菜单来进行编辑等操作。

可定制性:树控件中的节点可以设置不同的图标、颜色和字体等属性,以适应不同的需求和样式。

在PyQt5中,可以通过以下方法来操作树控件:


添加节点:可以通过QTreeWidget.addTopLevelItem()方法或QTreeWidgetItem.addChild()方法来添加节点。

删除节点:可以通过QTreeWidget.takeTopLevelItem()方法或QTreeWidgetItem.removeChild()方法来删除节点。

获取节点:可以通过QTreeWidget.topLevelItem()方法或QTreeWidgetItem.child()方法来获取节点。

设置节点属性:可以通过QTreeWidgetItem.setText()、QTreeWidgetItem.setIcon()等方法来设置节点的文本、图标等属性。

选择节点:可以通过QTreeWidget.currentItem()方法获取当前选中的节点,也可以通过QTreeWidgetItem.setSelected

7-3-2、树控件综合案例分析

在这个案例中,我们创建了一个名为"组织结构图"的主窗口,并设置了固定的大小。然后,我们创建了一个树控件(QTreeWidget),并设置了树控件的列标题为"姓名"、“职位"和"部门”。


在populateTreeWidget()方法中,我们首先创建了根节点,并将其添加到树控件中。然后,我们创建了两个部门节点(department1和department2)作为根节点的子节点,以及每个部门节点下的员工节点。


每个节点的数据由一个字符串列表表示,其中包括员工的姓名、职位和部门信息。我们使用QTreeWidgetItem类来创建节点,并将其添加为父节点的子节点。


最后,我们展开了根节点,以便在组织结构图中显示默认的部门和员工关系。



import sys

from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeWidget, QTreeWidgetItem


class OrganizationChart(QMainWindow):

    def __init__(self):

        super().__init__()


        self.setWindowTitle("组织结构图")

        self.resize(500, 400)


        self.treeWidget = QTreeWidget()

        self.treeWidget.setHeaderLabels(["姓名", "职位", "部门"])


        self.populateTreeWidget()


        self.setCentralWidget(self.treeWidget)


    def populateTreeWidget(self):

        # 创建根节点

        root = QTreeWidgetItem(self.treeWidget, ["总经理", "总经理", ""])


        # 创建部门节点1

        department1 = QTreeWidgetItem(root, ["市场部", "部门经理", ""])

        employee1 = QTreeWidgetItem(department1, ["张三", "销售经理", "市场部"])

        employee2 = QTreeWidgetItem(department1, ["李四", "市场专员", "市场部"])


        # 创建部门节点2

        department2 = QTreeWidgetItem(root, ["技术部", "部门经理", ""])

        employee3 = QTreeWidgetItem(department2, ["王五", "技术总监", "技术部"])

        employee4 = QTreeWidgetItem(department2, ["赵六", "开发工程师", "技术部"])


        # 展开根节点

        self.treeWidget.expandItem(root)


if __name__ == "__main__":

    app = QApplication(sys.argv)


    organizationChart = OrganizationChart()

    organizationChart.show()


    sys.exit(app.exec_())



输出如下图所示:

在这里插入图片描述


7-4、QTabWidget控件

QTabWidget是Qt框架中的一个控件,用于创建和管理标签页(Tab)界面。它提供了一个选项卡式的布局,允许用户在不同的标签页之间切换,并且可以在每个标签页中显示不同的内容。


QTabWidget具有以下特点和功能:


标签页切换:QTabWidget通过标签栏(TabBar)显示不同的标签页,并且允许用户通过点击标签来切换当前显示的标签页。用户可以通过鼠标点击或者键盘快捷键进行切换。

多个标签页:QTabWidget支持创建多个标签页,每个标签页可以显示不同的内容。可以根据需要动态添加或移除标签页。

自定义标签:每个标签页可以自定义显示的标签文本、图标等,以便更好地表示内容。标签页的样式和外观也可以通过样式表进行自定义。

嵌套布局:在每个标签页中,可以使用其他布局和控件来构建复杂的界面。例如,可以在每个标签页中放置表单、列表、按钮等控件。

信号与槽:QTabWidget提供了一些信号和槽函数,用于处理标签页切换事件、关闭标签页等操作。通过连接信号和槽,可以实现与标签页相关的自定义逻辑和交互。

QTabWidget在用户界面设计中经常被用于组织和管理复杂的界面结构。它适用于需要在不同的标签页中显示不同内容的场景,如选项卡式的设置界面、多标签文档编辑器、多标签浏览器等。使用QTabWidget,开发者可以方便地创建交互式、易于导航的界面,提升用户体验和操作效率。


以下是一个简单案例:


import sys

from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QLabel, QTabWidget


if __name__ == "__main__":

    app = QApplication(sys.argv)


    # 创建主窗口

    mainWindow = QMainWindow()


    # 创建QTabWidget

    tabWidget = QTabWidget(mainWindow)


    # 创建标签页1

    tab1 = QWidget()

    layout1 = QVBoxLayout(tab1)

    label1 = QLabel("这是标签页1")

    layout1.addWidget(label1)


    # 创建标签页2

    tab2 = QWidget()

    layout2 = QVBoxLayout(tab2)

    label2 = QLabel("这是标签页2")

    layout2.addWidget(label2)


    # 将标签页添加到QTabWidget中

    tabWidget.addTab(tab1, "标签页1")

    tabWidget.addTab(tab2, "标签页2")


    # 设置主窗口的中央部件为QTabWidget

    mainWindow.setCentralWidget(tabWidget)

    mainWindow.resize(400, 300)

    mainWindow.show()


    sys.exit(app.exec_())


在这里插入图片描述


7-5、堆栈窗口控件(QStackedWidget)

堆栈窗口控件(QStackedWidget)是Qt框架提供的一种用于管理多个页面或窗口的容器控件。它可以显示多个子窗口,但每次只能显示其中的一个,其它子窗口则被隐藏。通过切换可见的子窗口,堆栈窗口控件允许用户在不同的页面之间进行导航和切换。


以下是堆栈窗口控件的一些特性和使用方法:


页面管理:堆栈窗口控件可以管理多个页面或窗口,每个页面都可以是一个QWidget或其子类。可以通过添加、插入和删除页面来动态管理堆栈中的子窗口。


导航和切换:通过在堆栈窗口控件中的子窗口之间进行切换,可以实现页面导航。可以使用setCurrentIndex()方法或setCurrentWidget()方法来设置当前可见的子窗口,从而切换页面。


信号和槽机制:堆栈窗口控件提供了一些信号,例如currentChanged信号,可以在当前页面发生变化时触发。可以使用这些信号与槽连接来处理页面切换时的逻辑。


堆栈管理:堆栈窗口控件维护一个内部的堆栈,用于跟踪页面的顺序。可以使用堆栈管理方法,如addWidget()、insertWidget()和removeWidget()来管理堆栈中的页面。


堆栈窗口控件适用于需要在不同页面之间进行切换或导航的应用程序场景,例如设置向导、多页表单、步骤流程等。通过使用堆栈窗口控件,可以方便地管理和显示多个页面,并实现简单而直观 的界面切换和导航效果。


7-6、停靠控件

停靠控件(Dock Widget)是一种常用的界面布局控件,它允许用户在主窗口中创建可停靠的面板或工具栏,以便对应用程序进行灵活的布局和组织。停靠控件提供了一种便捷的方式来管理和切换应用程序的功能模块,使用户可以根据自己的需求动态调整界面布局。


在 PyQt 中,停靠控件由 QDockWidget 类实现。它可以与 QMainWindow 或 QMainWindows 的派生类一起使用,使得应用程序的主窗口可以容纳多个停靠控件,并支持拖动、停靠和浮动等操作。


停靠控件通常具有以下特点和用途:


可停靠性:停靠控件可以通过拖拽的方式在主窗口中进行停靠,用户可以将其放置在合适的位置,如顶部、底部、左侧或右侧,也可以在主窗口之外浮动显示。这样,用户可以根据需要自定义界面的布局,使得工作区域更加整洁和高效。


提供附加功能:停靠控件通常用于承载应用程序的附加功能模块,如工具栏、属性面板、输出窗口等。通过将相关的功能模块组织在不同的停靠控件中,用户可以方便地切换和使用这些功能,提高工作效率。


用户自定义:停靠控件通常提供了用户自定义的能力,允许用户根据自己的喜好和工作流程调整界面布局。用户可以自由地调整停靠控件的大小、位置和停靠方式,以适应不同的工作环境和任务需求。


在使用停靠控件时,可以通过以下步骤实现:


创建停靠控件对象:使用 QDockWidget 类创建一个停靠控件对象,并将需要承载的内容设置为其子部件。


设置停靠属性:可以设置停靠控件的标题、图标、位置等属性,以及允许的停靠区域和停靠方式。


将停靠控件添加到主窗口:使用 QMainWindow 或 QMainWindows 的派生类将停靠控件添加到主窗口中的合适位置,通常使用 addDockWidget() 方法来完成。


通过使用停靠控件,用户可以轻松实现界面的灵活布局和组织,以适应不同的任务和工作流程。停靠控件的可停靠性、自定义性和附加功能使得应用程序更加可扩展和易用,提供了良停靠控件(Dock Widget)是一种常用的界面布局控件,它允许用户在主窗口中创建可停靠的面板或工具栏,以便对应用程序进行灵活的布局和组织。停靠控件提供了一种便捷的方式来管理和切换应用程序的功能模块,使用户可以根据自己的需求动态调整界面布局。


在 PyQt 中,停靠控件由 QDockWidget 类实现。它可以与 QMainWindow 或 QMainWindow 的派生类一起使用,使得应用程序的主窗口可以容纳多个停靠控件,并支持拖动、停靠和浮动等操作。


停靠控件的主要特点和用途如下:


可停靠性:停靠控件可以通过拖拽的方式在主窗口中进行停靠。用户可以将其放置在合适的位置,如顶部、底部、左侧或右侧,也可以在主窗口之外浮动显示。这种灵活性使得用户可以根据实际需求自定义界面布局,提高工作效率。


提供附加功能:停靠控件通常用于承载应用程序的附加功能模块,如工具栏、属性面板、输出窗口等。通过将相关的功能模块组织在不同的停靠控件中,用户可以方便地切换和使用这些功能,提高工作效率。


用户自定义:停靠控件通常提供了用户自定义的能力,允许用户根据自己的喜好和工作流程调整界面布局。用户可以自由地调整停靠控件的大小、位置和停靠方式,以适应不同的工作环境和任务需求。


在使用停靠控件时,可以按照以下步骤进行:


创建停靠控件对象:使用 QDockWidget 类创建一个停靠控件对象,并将需要承载的内容设置为其子部件。


设置停靠属性:可以设置停靠控件的标题、图标、位置等属性,以及允许的停靠区域和停靠方式。


将停靠控件添加到主窗口:使用 QMainWindow 或 QMainWindow 的派生类将停靠控件添加到主窗口中的合适位置,通常使用 addDockWidget() 方法来完成。


通过使用停靠控件,用户可以轻松实现界面的灵活布局和组织,以适应不同的任务和工作流程。停靠控件的可停靠性、自定义性和附加功能使得应用程序更加可扩展和易用,提供了良好的用户体验。


综合案例实现:


import sys

from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit, QAction, QFileDialog, QMessageBox, QVBoxLayout, QWidget, QLabel, QPushButton, QTreeWidget, QTreeWidgetItem


class NotePad(QMainWindow):

    def __init__(self):

        super().__init__()


        self.initUI()


    def initUI(self):

        self.setWindowTitle("NotePad")

        self.setGeometry(100, 100, 800, 600)


        # 创建文本编辑区域

        self.textEdit = QTextEdit()

        self.setCentralWidget(self.textEdit)


        # 创建停靠控件

        dock = QDockWidget("File Actions", self)

        dock.setAllowedAreas(Qt.LeftDockWidgetArea)


        # 创建停靠控件中的内容,包括打开文件按钮和保存文件按钮

        openButton = QPushButton("Open File")

        openButton.clicked.connect(self.openFile)


        saveButton = QPushButton("Save File")

        saveButton.clicked.connect(self.saveFile)


        layout = QVBoxLayout()

        layout.addWidget(openButton)

        layout.addWidget(saveButton)


        widget = QWidget()

        widget.setLayout(layout)

        dock.setWidget(widget)


        # 将停靠控件添加到主窗口的左侧停靠区域

        self.addDockWidget(Qt.LeftDockWidgetArea, dock)


        # 创建菜单和动作

        self.createActions()

        self.createMenus()


        # 创建侧边栏

        self.createSidebar()


        self.show()


    def createActions(self):

        self.openAction = QAction("Open File", self)

        self.openAction.triggered.connect(self.openFile)


        self.saveAction = QAction("Save File", self)

        self.saveAction.triggered.connect(self.saveFile)


    def createMenus(self):

        self.fileMenu = self.menuBar().addMenu("File")

        self.fileMenu.addAction(self.openAction)

        self.fileMenu.addAction(self.saveAction)


    def createSidebar(self):

        # 创建侧边栏

        sidebarDock = QDockWidget("Notes", self)

        sidebarDock.setAllowedAreas(Qt.LeftDockWidgetArea)


        # 创建树控件

        treeWidget = QTreeWidget()

        treeWidget.setHeaderLabels(["Notes"])


        # 添加示例笔记

        root = QTreeWidgetItem(treeWidget)

        root.setText(0, "Notebook")


        note1 = QTreeWidgetItem(root)

        note1.setText(0, "Note 1")


        note2 = QTreeWidgetItem(root)

        note2.setText(0, "Note 2")


        # 将树控件添加到侧边栏

        sidebarDock.setWidget(treeWidget)

        self.addDockWidget(Qt.LeftDockWidgetArea, sidebarDock)


    def openFile(self):

        fileName, _ = QFileDialog.getOpenFileName(self, "Open File")

        if fileName:

            try:

                with open(fileName, 'r') as file:

                    content = file.read()

                self.textEdit.setPlainText(content)

            except Exception as e:

                QMessageBox.critical(self, "Error", str(e))


    def saveFile(self):

        fileName, _ = QFileDialog.getSaveFileName(self, "Save File")

        if fileName:

            try:

                with open(fileName, 'w') as file:

                    content = self.textEdit.toPlainText()

                    file.write(content)

                QMessageBox.information(self, "Success", "File saved successfully.")

            except Exception as e:

                QMessageBox.critical(self, "Error", str(e))


if __name__ == '__main__':

    app = QApplication(sys.argv)

    notepad = NotePad()

    sys.exit(app.exec_())





输出界面如下所示:

在这里插入图片描述


八、PyQt5图形与特效(定制窗口风格、绘图、QSS与UI美化、不规则窗口、设置样式等)

九、PyQt5扩展应用(制作PyQt5安装程序、数据处理、第三方图绘图库在PyQt5中的应用、UI自动化测试等)


原文链接:https://blog.csdn.net/weixin_42475060/article/details/130327901

栏目分类

联系方式
  • help@yxrjt.cn
  • lgc@yxrjt.cn
  • admin@yxrjt.cn