Python GUI Pyside6 实例笔记

例【1】

好的!我们将通过一个简单的案例来学习如何使用 PySide6 创建一个基本的桌面应用程序。这个案例将展示如何创建一个带有按钮的窗口,当点击按钮时,会弹出一个消息框。

1. 安装 PySide6

首先,确保你已经安装了 PySide6。如果没有安装,可以使用以下命令进行安装:

pip install PySide6

2. 创建一个简单的窗口

我们将创建一个简单的窗口,窗口中包含一个按钮。当用户点击按钮时,会弹出一个消息框。

import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QMessageBoxclass MyWindow(QWidget):def __init__(self):super().__init__()# 设置窗口标题self.setWindowTitle("PySide6 示例")# 设置窗口大小self.resize(300, 200)# 创建一个按钮self.button = QPushButton("点击我", self)self.button.clicked.connect(self.show_message)# 设置按钮的位置和大小self.button.setGeometry(100, 80, 100, 40)def show_message(self):# 创建一个消息框QMessageBox.information(self, "消息", "你点击了按钮!")if __name__ == "__main__":# 创建应用程序对象app = QApplication(sys.argv)# 创建窗口对象window = MyWindow()# 显示窗口window.show()# 进入应用程序的主循环sys.exit(app.exec())

 

3. 代码解释

  • QApplication: 这是 PySide6 应用程序的核心类。每个 PySide6 应用程序都需要创建一个 QApplication 对象。
  • QWidget: 这是所有用户界面对象的基类。我们创建的窗口 MyWindow 继承自 QWidget
  • QPushButton: 这是一个按钮控件。我们创建了一个按钮,并将其添加到窗口中。
  • QMessageBox: 这是一个用于显示消息框的类。当用户点击按钮时,我们使用 QMessageBox.information 来显示一个消息框。
  • self.button.clicked.connect(self.show_message): 这里我们将按钮的 clicked 信号连接到 show_message 槽函数。当按钮被点击时,show_message 函数会被调用。
  • app.exec(): 这是应用程序的主事件循环。它会一直运行,直到窗口被关闭。

4. 运行代码

将上述代码保存为一个 Python 文件(例如 main.py),然后在终端中运行:

python main.py

你将看到一个带有按钮的窗口。当你点击按钮时,会弹出一个消息框,显示“你点击了按钮!”。

5. 进一步学习

通过这个简单的案例,你已经学会了如何使用 PySide6 创建一个基本的桌面应用程序。接下来,你可以尝试添加更多的控件(如文本框、标签等),并学习如何处理用户输入、布局管理、信号与槽机制等更高级的功能。

例【2】

好的!接下来我们通过第二个例子来进一步学习 PySide6。这个例子将展示如何使用 布局管理器多个控件 来创建一个更复杂的用户界面。

我们将创建一个简单的表单应用程序,包含以下功能:

  1. 一个输入框用于输入用户名。
  2. 一个输入框用于输入密码。
  3. 一个登录按钮,点击后检查用户名和密码是否正确。
  4. 一个标签用于显示登录结果。

示例代码


代码解释

  1. 布局管理器 (QVBoxLayout):
    • 我们使用 QVBoxLayout 垂直布局管理器来排列控件。
    • 控件会按照添加的顺序从上到下排列。
  1. 控件:
    • QLabel: 用于显示文本标签。
    • QLineEdit: 用于输入文本。我们为密码输入框设置了 setEchoMode(QLineEdit.Password),使输入内容显示为星号。
    • QPushButton: 用于触发登录操作。
  1. 信号与槽:
    • 当点击登录按钮时,button_login.clicked.connect(self.check_login) 会将点击事件连接到 check_login 方法。
  1. 登录逻辑:
    • check_login 方法中,我们检查输入的用户名和密码是否正确。
    • 如果用户名是 admin 且密码是 123456,则显示登录成功的消息;否则显示登录失败的消息。
  1. 消息框 (QMessageBox):
    • 使用 QMessageBox.information 显示成功消息。
    • 使用 QMessageBox.warning 显示失败消息。

运行代码

将上述代码保存为 login_form.py,然后在终端中运行:

python login_form.py

你会看到一个登录表单窗口,输入用户名和密码后点击登录按钮,程序会检查输入是否正确并显示相应的消息。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用布局管理器 (QVBoxLayout) 来排列控件。
  • 如何使用 QLineEditQPushButton 等控件。
  • 如何处理按钮点击事件并实现简单的逻辑。

接下来,你可以尝试:

  1. 添加更多的输入字段(如邮箱、电话号码)。
  2. 使用其他布局管理器(如 QHBoxLayoutQGridLayout)。
  3. 将数据保存到文件或数据库中。

 😊

例【3】

好的!接下来我们通过第三个例子来学习如何使用 PySide6 创建一个带有菜单栏、工具栏和状态栏的完整桌面应用程序。这个例子将展示如何构建一个更复杂的用户界面,并实现一些常见的功能。


示例:文本编辑器

我们将创建一个简单的文本编辑器,包含以下功能:

  1. 菜单栏:包含“文件”菜单,支持打开、保存和退出操作。
  2. 工具栏:包含“打开”和“保存”按钮。
  3. 状态栏:显示当前文件的状态。
  4. 文本编辑区域:用于编辑文本内容。

示例代码


代码解释

  1. QMainWindow:
    • QMainWindow 是主窗口类,提供了菜单栏、工具栏、状态栏和中心部件的支持。
  1. 菜单栏 (QMenuBar):
    • 使用 menuBar() 创建菜单栏。
    • 添加“文件”菜单,包含“打开”、“保存”和“退出”动作。
  1. 工具栏 (QToolBar):
    • 使用 QToolBar 创建工具栏。
    • 添加“打开”和“保存”按钮。
  1. 状态栏 (QStatusBar):
    • 使用 QStatusBar 创建状态栏,用于显示当前文件的状态。
  1. 文本编辑区域 (QTextEdit):
    • 使用 QTextEdit 作为中心部件,用于编辑文本内容。
  1. 文件操作:
    • open_file: 打开文件并加载内容到文本编辑区域。
    • save_file: 保存文本编辑区域的内容到文件。
  1. 图标:
    • 使用 QIcon 为动作添加图标(需要准备图标文件,如 open.pngsave.png)。

运行代码

将上述代码保存为 text_editor.py,然后在终端中运行:

python text_editor.py

你会看到一个简单的文本编辑器窗口,支持打开、保存文本文件,并显示状态信息。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用 QMainWindow 创建主窗口。
  • 如何添加菜单栏、工具栏和状态栏。
  • 如何实现文件操作(打开、保存)。

接下来,你可以尝试:

  1. 添加更多功能,如“另存为”、“撤销”、“重做”等。
  2. 支持更多文件格式(如 Markdown、HTML)。
  3. 添加快捷键支持(如 Ctrl+O 打开文件)。

 😊

例【4】

好的!接下来我们通过第四个例子来学习如何使用 PySide6 创建一个带有 表格控件数据操作 的应用程序。这个例子将展示如何使用 QTableWidget 来显示和编辑表格数据,并实现数据的增删改查功能。


示例:学生信息管理系统

我们将创建一个简单的学生信息管理系统,包含以下功能:

  1. 表格显示:使用 QTableWidget 显示学生信息(姓名、年龄、成绩)。
  2. 添加数据:通过对话框添加新的学生信息。
  3. 删除数据:删除选中的学生信息。
  4. 编辑数据:双击表格单元格编辑学生信息。
  5. 保存和加载数据:将数据保存到文件并从文件加载数据。

示例代码


代码解释

  1. QTableWidget:
    • 用于显示和编辑表格数据。
    • 设置表头标签为 ["姓名", "年龄", "成绩"]
    • 支持双击编辑单元格内容。
  1. 添加数据:
    • 使用 QInputDialog 弹出输入对话框,获取学生信息。
    • 将新数据插入到表格中。
  1. 删除数据:
    • 删除选中的行。
  1. 保存数据:
    • 将表格数据保存为 CSV 文件。
  1. 加载数据:
    • 从 CSV 文件加载数据并显示在表格中。
  1. 菜单栏和状态栏:
    • 提供保存、加载和退出功能。
    • 状态栏显示当前操作的状态。

运行代码

将上述代码保存为 student_manager.py,然后在终端中运行:

python student_manager.py

你会看到一个学生信息管理系统窗口,支持添加、删除、编辑学生信息,并可以将数据保存到文件或从文件加载数据。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用 QTableWidget 显示和编辑表格数据。
  • 如何实现数据的增删改查功能。
  • 如何将数据保存到文件和从文件加载数据。

接下来,你可以尝试:

  1. 添加更多字段(如性别、班级)。
  2. 实现数据排序和过滤功能。
  3. 使用数据库(如 SQLite)存储数据。

 😊

例【5】

好的!接下来我们通过第五个例子来学习如何使用 PySide6 创建一个带有 图形绘制功能 的应用程序。这个例子将展示如何使用 QPainter 在窗口中绘制简单的图形(如线条、矩形、圆形等),并支持用户交互(如鼠标点击绘制点)。


示例:简单绘图工具

我们将创建一个简单的绘图工具,包含以下功能:

  1. 绘制图形:支持绘制线条、矩形、圆形。
  2. 选择颜色:通过颜色对话框选择绘图颜色。
  3. 清空画布:清除所有绘制的图形。
  4. 保存绘图:将绘图保存为图片文件。

示例代码


代码解释

  1. DrawingWidget:
    • 继承自 QWidget,用于处理绘图逻辑。
    • 使用 QPainterpaintEvent 中绘制图形。
    • 支持鼠标事件(按下、移动、释放)来绘制图形。
  1. 绘图模式:
    • 支持绘制线条、矩形和圆形。
    • 通过 drawing_mode 属性切换绘图模式。
  1. 颜色选择:
    • 使用 QColorDialog 选择绘图颜色。
  1. 清空画布:
    • 清空所有绘制的图形。
  1. 保存绘图:
    • 使用 QImage 将绘图保存为图片文件(PNG 或 JPEG)。
  1. 主窗口:
    • 包含按钮用于切换绘图模式、选择颜色、清空画布和保存绘图。

运行代码

将上述代码保存为 drawing_tool.py,然后在终端中运行:

python drawing_tool.py

你会看到一个简单的绘图工具窗口,支持绘制线条、矩形和圆形,并可以保存绘图为图片。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用 QPainter 绘制图形。
  • 如何处理鼠标事件来实现交互式绘图。
  • 如何保存绘图为图片文件。

接下来,你可以尝试:

  1. 添加更多绘图工具(如画笔、橡皮擦)。
  2. 支持撤销和重做功能。
  3. 实现更复杂的图形(如多边形、曲线)。

 😊

例【6】

好的!接下来我们通过第六个例子来学习如何使用 PySide6 创建一个带有 多线程 的应用程序。这个例子将展示如何在 GUI 应用程序中使用多线程来执行耗时任务,避免界面卡顿。


示例:多线程任务执行器

我们将创建一个简单的任务执行器,包含以下功能:

  1. 任务执行:在后台线程中执行耗时任务。
  2. 进度更新:在主线程中更新任务进度。
  3. 任务取消:支持取消正在执行的任务。
  4. 任务完成通知:任务完成后弹出提示。

示例代码


代码解释

  1. WorkerThread:
    • 继承自 QThread,用于在后台执行耗时任务。
    • 使用 update_progress 信号更新任务进度。
    • 使用 task_finished 信号通知任务完成。
    • 支持任务取消功能。
  1. TaskExecutor:
    • 主窗口类,包含进度条、开始按钮和取消按钮。
    • 使用 WorkerThread 执行任务,并通过信号更新 UI。
  1. 信号与槽:
    • update_progress:用于更新进度条。
    • task_finished:用于任务完成后的处理。
  1. 任务取消:
    • 使用 QMutex 实现线程安全的任务取消功能。
  1. UI 更新:
    • 在任务执行期间禁用开始按钮,启用取消按钮。
    • 任务完成后恢复按钮状态。

运行代码

将上述代码保存为 task_executor.py,然后在终端中运行:

python task_executor.py

你会看到一个任务执行器窗口,点击“开始任务”按钮后,进度条会逐渐更新。你可以随时点击“取消任务”按钮停止任务。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用 QThread 在后台执行耗时任务。
  • 如何使用信号与槽机制更新 UI。
  • 如何实现任务取消功能。

接下来,你可以尝试:

  1. 添加更多任务类型(如文件下载、数据处理)。
  2. 实现任务队列,支持多个任务依次执行。
  3. 使用线程池 (QThreadPool) 管理多个线程。

 😊

例【7】

好的!接下来我们通过第七个例子来学习如何使用 PySide6 创建一个带有 网络请求功能 的应用程序。这个例子将展示如何使用 QNetworkAccessManager 发送 HTTP 请求并处理响应,同时结合 GUI 实现一个简单的天气查询工具。


示例:简单天气查询工具

我们将创建一个简单的天气查询工具,包含以下功能:

  1. 输入城市名称:用户输入城市名称。
  2. 发送网络请求:使用 QNetworkAccessManager 发送 HTTP 请求到天气 API。
  3. 显示天气信息:解析 API 返回的 JSON 数据并显示天气信息。
  4. 错误处理:处理网络请求失败的情况。

示例代码


代码解释

  1. QNetworkAccessManager:
    • 用于发送 HTTP 请求和处理响应。
    • 通过 get 方法发送 GET 请求。
  1. QNetworkRequest:
    • 用于构造 HTTP 请求。
    • 设置请求的 URL。
  1. QNetworkReply:
    • 用于处理 HTTP 响应。
    • 通过 finished 信号连接槽函数 handle_response
  1. JSON 解析:
    • 使用 json 模块解析 API 返回的 JSON 数据。
    • 提取城市名称、温度和天气描述。
  1. 错误处理:
    • 检查 reply.error() 是否为 QNetworkReply.NoError
    • 处理网络错误和无效的城市名称。
  1. UI 组件:
    • QLineEdit:用于输入城市名称。
    • QPushButton:用于触发查询操作。
    • QTextEdit:用于显示查询结果。

运行代码

  1. 将上述代码保存为 weather_app.py
  2. 替换 api_key 为你的天气 API 密钥(可以从 OpenWeatherMap 获取)。
  3. 在终端中运行:
python weather_app.py

你会看到一个天气查询工具窗口,输入城市名称后点击“查询天气”按钮,程序会显示该城市的天气信息。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用 QNetworkAccessManager 发送 HTTP 请求。
  • 如何处理和解析 JSON 数据。
  • 如何在 GUI 应用程序中实现网络请求功能。

接下来,你可以尝试:

  1. 添加更多天气信息(如湿度、风速)。
  2. 支持多城市查询。
  3. 使用其他 API(如新闻 API、地图 API)。

 😊

例【8】

好的!接下来我们通过第八个例子来学习如何使用 PySide6 创建一个带有 数据库功能 的应用程序。这个例子将展示如何使用 SQLite 数据库存储和检索数据,并结合 GUI 实现一个简单的联系人管理系统。


示例:联系人管理系统

我们将创建一个简单的联系人管理系统,包含以下功能:

  1. 添加联系人:输入姓名和电话号码,保存到数据库。
  2. 显示联系人:从数据库中加载联系人并显示在表格中。
  3. 删除联系人:删除选中的联系人。
  4. 搜索联系人:根据姓名搜索联系人。

示例代码


代码解释

  1. SQLite 数据库:
    • 使用 sqlite3 模块创建和管理 SQLite 数据库。
    • 创建 contacts 表存储联系人信息。
  1. QTableWidget:
    • 用于显示联系人信息。
    • 支持选中行和删除操作。
  1. 添加联系人:
    • 将用户输入的姓名和电话插入到数据库中。
    • 重新加载联系人列表。
  1. 删除联系人:
    • 删除选中的联系人。
    • 重新加载联系人列表。
  1. 搜索联系人:
    • 根据姓名搜索联系人。
    • 使用 SQL 的 LIKE 语句实现模糊搜索。
  1. 关闭事件:
    • 在窗口关闭时关闭数据库连接。

运行代码

  1. 将上述代码保存为 contact_manager.py
  2. 在终端中运行:
python contact_manager.py

你会看到一个联系人管理系统窗口,支持添加、删除和搜索联系人。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用 SQLite 数据库存储和检索数据。
  • 如何在 GUI 应用程序中实现数据库操作。
  • 如何使用表格控件显示数据。

接下来,你可以尝试:

  1. 添加更多字段(如邮箱、地址)。
  2. 实现联系人编辑功能。
  3. 使用其他数据库(如 MySQL、PostgreSQL)。

 😊

例【9】

好的!接下来我们通过第九个例子来学习如何使用 PySide6 创建一个带有 图表绘制功能 的应用程序。这个例子将展示如何使用 QtCharts 模块绘制动态折线图,并结合 GUI 实现一个简单的实时数据监控工具。


示例:实时数据监控工具

我们将创建一个简单的实时数据监控工具,包含以下功能:

  1. 动态折线图:实时显示随机生成的数据。
  2. 开始/停止监控:控制数据的生成和显示。
  3. 清空图表:清除当前图表数据。

示例代码


代码解释

  1. QtCharts:
    • 使用 QChartQLineSeries 创建折线图。
    • 使用 QValueAxis 设置坐标轴范围和标题。
  1. QTimer:
    • 使用 QTimer 定时生成数据并更新图表。
    • 定时器间隔为 100 毫秒。
  1. 动态数据更新:
    • 每次定时器触发时生成一个随机数,并添加到数据列表中。
    • 限制数据列表的长度为 100,超出时移除最早的数据。
  1. 按钮功能:
    • 开始监控:启动定时器,开始生成和显示数据。
    • 停止监控:停止定时器,暂停数据生成。
    • 清空图表:清除图表中的所有数据。
  1. UI 布局:
    • 使用 QVBoxLayout 垂直排列图表和按钮。

运行代码

  1. 将上述代码保存为 real_time_monitor.py
  2. 在终端中运行:
python real_time_monitor.py

你会看到一个实时数据监控工具窗口,点击“开始监控”按钮后,图表会动态显示随机生成的数据。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用 QtCharts 绘制动态折线图。
  • 如何使用 QTimer 实现实时数据更新。
  • 如何在 GUI 应用程序中实现数据监控功能。

接下来,你可以尝试:

  1. 添加更多数据系列(如多条折线)。
  2. 实现数据保存和加载功能。
  3. 使用其他图表类型(如柱状图、饼图)。

 😊

例【10】

好的!接下来我们通过第十个例子来学习如何使用 PySide6 创建一个带有 多媒体功能 的应用程序。这个例子将展示如何使用 QMediaPlayerQVideoWidget 实现一个简单的视频播放器。


示例:简单视频播放器

我们将创建一个简单的视频播放器,包含以下功能:

  1. 播放视频:加载并播放视频文件。
  2. 暂停/继续:暂停或继续播放视频。
  3. 音量控制:调整视频音量。
  4. 进度控制:拖动滑块调整播放进度。

示例代码


代码解释

  1. QMediaPlayer:
    • 用于播放视频文件。
    • 支持播放、暂停、音量控制和进度控制。
  1. QVideoWidget:
    • 用于显示视频内容。
  1. QSlider:
    • 用于控制音量和播放进度。
  1. QFileDialog:
    • 用于选择视频文件。
  1. 信号与槽:
    • positionChanged:视频播放位置变化时更新进度滑块。
    • durationChanged:视频总时长变化时更新进度滑块范围。
  1. 按钮功能:
    • 播放:开始播放视频。
    • 暂停:暂停播放视频。
    • 打开视频文件:选择并加载视频文件。

运行代码

  1. 将上述代码保存为 video_player.py
  2. 在终端中运行:
python video_player.py

你会看到一个视频播放器窗口,点击“打开视频文件”按钮选择视频文件后,可以播放、暂停视频,并调整音量和播放进度。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用 QMediaPlayerQVideoWidget 播放视频。
  • 如何实现视频播放器的基本控制功能(播放、暂停、音量、进度)。
  • 如何使用 QFileDialog 选择文件。

接下来,你可以尝试:

  1. 添加更多功能(如全屏播放、播放列表)。
  2. 支持更多视频格式。
  3. 实现字幕加载功能。

 😊

例【11】

你的代码已经实现了一个功能丰富的 QTabBar 示例,支持动态添加、关闭和移动选项卡,并且通过样式表美化了界面。以下是代码的详细解释和一些改进建议:


代码解释

  1. 主窗口和布局
    • 使用 QMainWindow 作为主窗口,并设置标题和初始大小。
    • 使用 QVBoxLayout 作为主布局,包含一个 QHBoxLayout 用于放置 QTabBar 和添加按钮。
  1. QTabBar
    • 使用 QTabBar 创建选项卡栏。
    • 设置选项卡高度为固定值(setFixedHeight(40))。
    • 禁止选项卡自动扩展(setExpanding(False))。
    • 启用滚动按钮(setUsesScrollButtons(True))。
  1. 添加按钮
    • 使用 QPushButton 创建添加按钮,点击后动态添加新选项卡。
    • 按钮的样式通过 setStyleSheet 设置。
  1. 选项卡功能
    • 支持动态添加选项卡(add_new_tab 方法)。
    • 支持关闭选项卡(tabCloseRequested 信号)。
    • 支持移动选项卡(tabMoved 信号)。
    • 支持切换选项卡(currentChanged 信号)。
  1. 样式表
    • 使用 setStyleSheet 美化 QTabBar 和按钮。
    • 设置选项卡的固定宽度为 120 像素。

改进建议

  1. 固定第一个和最后一个选项卡的大小
    • 如果你希望第一个和最后一个选项卡的大小固定,可以继承 QTabBar 并重写 tabSizeHint 方法。
  1. 选项卡内容管理
    • 当前代码只管理选项卡的标签,没有管理选项卡的内容。可以结合 QStackedWidget 来管理每个选项卡的内容。
  1. 优化样式
    • 可以进一步优化样式,例如为选中的选项卡添加更明显的视觉效果。

改进后的代码

以下是改进后的代码,结合了 QStackedWidget 来管理选项卡内容,并优化了样式:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QTabBar, QPushButton, QHBoxLayout, QLabel, QStackedWidget
from PySide6.QtCore import Qt, QSizeclass TabBarDemo(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("QTabBar 示例")self.setGeometry(100, 100, 600, 400)self.tab_count = 1  # 用于生成新标签页的计数器# 创建中心部件和布局central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout(central_widget)# 创建水平布局来放置TabBar和添加按钮top_layout = QHBoxLayout()# 创建 QTabBarself.tab_bar = QTabBar()# 设置标签页固定大小self.tab_bar.setFixedHeight(40)  # 设置标签栏高度self.tab_bar.setExpanding(False)  # 禁止标签自动扩展self.tab_bar.setUsesScrollButtons(True)  # 启用滚动按钮top_layout.addWidget(self.tab_bar)# 创建添加标签页的按钮add_button = QPushButton("+")add_button.setFixedSize(30, 25)add_button.clicked.connect(self.add_new_tab)top_layout.addWidget(add_button)# 将水平布局添加到主布局main_layout.addLayout(top_layout)# 创建 QStackedWidget 来管理选项卡内容self.stacked_widget = QStackedWidget()main_layout.addWidget(self.stacked_widget)# 添加初始选项卡self.add_tab("首页", "这是首页内容")self.add_tab("文档", "这是文档内容")self.add_tab("设置", "这是设置内容")self.add_tab("关于", "这是关于内容")# 设置标签页可移动self.tab_bar.setMovable(True)# 设置标签页可关闭self.tab_bar.setTabsClosable(True)# 连接信号self.tab_bar.currentChanged.connect(self.tab_changed)self.tab_bar.tabCloseRequested.connect(self.close_tab)self.tab_bar.tabMoved.connect(self.tab_moved)# 添加一些样式self.tab_bar.setStyleSheet("""QTabBar::tab {background: #f0f0f0;border: 1px solid #c0c0c0;padding: 8px 20px;margin-right: 2px;border-top-left-radius: 4px;border-top-right-radius: 4px;width: 120px;  /* 设置标签固定宽度 */max-width: 120px;  /* 设置最大宽度 */min-width: 120px;  /* 设置最小宽度 */}QTabBar::tab:selected {background: #e0e0e0;border-bottom-color: #e0e0e0;}QTabBar::tab:hover {background: #e5e5e5;}QTabBar::scroller {width: 20px;}QTabBar QToolButton {background: #f0f0f0;border: 1px solid #c0c0c0;border-radius: 4px;}QTabBar QToolButton:hover {background: #e5e5e5;}""")add_button.setStyleSheet("""QPushButton {background: #f0f0f0;border: 1px solid #c0c0c0;border-radius: 4px;font-weight: bold;}QPushButton:hover {background: #e5e5e5;}""")def add_tab(self, name, content):# 添加选项卡index = self.tab_bar.addTab(name)# 创建内容页面page = QLabel(content)page.setAlignment(Qt.AlignCenter)self.stacked_widget.addWidget(page)# 切换到新添加的选项卡self.tab_bar.setCurrentIndex(index)def add_new_tab(self):new_tab_name = f"新标签页 {self.tab_count}"self.add_tab(new_tab_name, f"这是 {new_tab_name} 的内容")self.tab_count += 1print(f"添加新标签页: {new_tab_name}")def tab_changed(self, index):# 切换选项卡时更新内容self.stacked_widget.setCurrentIndex(index)print(f"切换到标签页 {index}: {self.tab_bar.tabText(index)}")def close_tab(self, index):# 关闭选项卡时移除内容和标签self.tab_bar.removeTab(index)self.stacked_widget.removeWidget(self.stacked_widget.widget(index))print(f"关闭标签页 {index}")def tab_moved(self, _from, to):# 移动选项卡时更新内容顺序widget = self.stacked_widget.widget(_from)self.stacked_widget.removeWidget(widget)self.stacked_widget.insertWidget(to, widget)print(f"标签页从位置 {_from} 移动到位置 {to}")if __name__ == "__main__":app = QApplication(sys.argv)window = TabBarDemo()window.show()sys.exit(app.exec())

 


改进点

  1. 结合 QStackedWidget
    • 使用 QStackedWidget 管理每个选项卡的内容。
    • 切换选项卡时,更新 QStackedWidget 的当前页面。
  1. 动态添加和删除内容
    • 添加选项卡时,同时添加对应的内容页面。
    • 删除选项卡时,同时移除对应的内容页面。
  1. 优化样式
    • 保持原有样式,确保界面美观。

运行代码

  1. 将上述代码保存为 tabbar_demo.py
  2. 在终端中运行:
python tabbar_demo.py

你会看到一个功能丰富的选项卡管理器窗口,支持动态添加、关闭和移动选项卡,并且每个选项卡都有对应的内容。


进一步学习

通过这个例子,你已经学会了:

  • 如何使用 QTabBarQStackedWidget 管理选项卡和内容。
  • 如何动态添加和删除选项卡。
  • 如何美化界面。

 😊

例【12】

PySide6移除窗口顶部栏

代码:

import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton
from PySide6.QtCore import Qt, QPointclass FramelessWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle("Frameless Window")self.setGeometry(100, 100, 400, 300)# 设置窗口标志,移除顶部栏self.setWindowFlags(Qt.FramelessWindowHint)# 用于窗口拖动的变量self.dragging = Falseself.offset = QPoint()# 添加关闭按钮self.close_button = QPushButton('X', self)self.close_button.setGeometry(self.width() - 30, 0, 30, 30)  # 设置按钮位置和大小self.close_button.clicked.connect(self.close)  # 连接关闭按钮的点击事件到关闭窗口的方法def mousePressEvent(self, event):if event.button() == Qt.LeftButton:self.dragging = Trueself.offset = event.globalPosition().toPoint() - self.pos()def mouseMoveEvent(self, event):if self.dragging:self.move(event.globalPosition().toPoint() - self.offset)def mouseReleaseEvent(self, event):if event.button() == Qt.LeftButton:self.dragging = Falseif __name__ == "__main__":app = QApplication(sys.argv)window = FramelessWindow()window.show()sys.exit(app.exec())

 

contine...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3335.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CIA-Access V2.5_9_2_10G EPON技术原理_关键技术

10G EPON关键技术,主要包含测距,突发光电技术,DBA以及线路加密。 关键技术之MPCP测距 第一个仍然是测距,每一个ONU到OLT的逻辑距离是不相等的,另外OLT与ONU之间的环路时间也会随着时间和环境的变化而变化,…

PDF文件提取开源工具调研总结

概述 PDF是一种日常工作中广泛使用的跨平台文档格式,常常包含丰富的内容:包括文本、图表、表格、公式、图像。在现代信息处理工作流中发挥了重要的作用,尤其是RAG项目中,通过将非结构化数据转化为结构化和可访问的信息&#xff0…

计算机网络 (43)万维网WWW

前言 万维网(World Wide Web,WWW)是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统。 一、基本概念与组成 定义:万维网是一个分布式、联机式的信息存储空间,通过超文本链接的方式将分散的信息…

ubuntu18.04开发环境下samba服务器的搭建

嵌入式linux的发展很快,最近准备在一个新项目上采用新一代的linux核心板,发现linux内核的版本已经更新到5.4以上甚至6.0以上;之前常用的linux内核版本是2.6.4,虽然在某些项目上还能用但是明显跟不上时代的步伐了,所以要…

HTML5+Canvas实现的鼠标跟随自定义发光线条源码

源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷&#xff0c;在黑色的背景中&#xff0c;鼠标滑过即产生彩色变换的发光线条效果&#xff0c;且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…

【论文阅读】基于空间相关性与Stacking集成学习的风电功率预测方法

文章目录 摘要0. 引言1. 空间相关性分析2. 风电功率预测模型2.1 Stacking 集成策略2.2 基学习器2.2.1 基于机器学习算法的基学习器2.2.2 基于神经网络的基学习器2.2.3 基于粒子群优化算法的超参数优化 2.3 元学习器2.4 基于空间相关性与Stacking集成学习的风电功率预测方法 3 算…

GMM高斯混合聚类算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GMM高斯混合聚类算法 matlab2023b语言&#xff0c;一键出图&#xff0c;直接运行 1.代码注释清晰&#xff0c;自行解读容易。 2…输出图例如图所示包括&#xff1a;聚类图(聚类结果图)&#xff0c;协方差矩阵类型…

LabVIEW实车四轮轮速信号再现系统

开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题&#xff0c;提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…

计算机网络常见协议

目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS&#xff08;SSL/TLS加密&#xff09; HTTPS协议 1. 对称加密 2. 非对称加密 3. 证书验证 4. 回顾https协议传输流程 HTTP TCP UDP 1. TCP&a…

算法面试准备 - 手撕系列第七期 - MLP(利用FashionMNIST数据集)

算法面试准备 - 手撕系列第七期 - MLP(利用FashionMNIST数据集) 目录 算法面试准备 - 手撕系列第七期 - MLP(利用FashionMNIST数据集)FashionMINIST 图像分类原理解析1. 全连接的原理图2. 背景介绍3.引入相关库函数4. 数据预处理5. 模型设计6. 初始化网络&#xff0c;损失函数与…

单元测试与unittest框架

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 单元测试的定义 1. 什么是单元测试&#xff1f; 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&am…

【Hugging Face】下载开源大模型步骤

Mac M1 1、国内镜像站 模型基本都可以在国内镜像站 https://hf-mirror.com/ 下载。 部分 Gated Repo 需登录申请许可&#xff0c;需先前往 Hugging Face 官网登录、申请许可&#xff0c;在官网这里获取 Access Token 后回镜像站用命令行下载。 2、注册登陆 Hugging Face 2.1…

STM32的集成开发环境STM32CubeIDE安装

STM32CubeIDE - STM32的集成开发环境 - 意法半导体STMicroelectronics

.Net8 Avalonia跨平台UI框架——<vlc:VideoView>控件播放海康监控、摄像机视频(Windows / Linux)

一、UI效果 二、新建用户控件&#xff1a;VideoViewControl.axaml 需引用&#xff1a;VideoLAN.LibVLC.Windows包 Linux平台需安装&#xff1a;VLC 和 LibVLC &#xff08;sudo apt-get update、sudo apt-get install vlc libvlccore-dev libvlc-dev&#xff09; .axaml 代码 注…

51.WPF应用加图标指南 C#例子 WPF例子

完整步骤&#xff1a; 先使用文心一言生成一个图标如左边使用Windows图片编辑器编辑&#xff0c;去除背景使用正方形&#xff0c;放大图片使图标铺满图片使用格式工程转换为ico格式&#xff0c;分辨率为最大 在资源管理器中右键项目添加ico类型图片到项目里图片属性设置为始终…

C++(二十一)

前言&#xff1a; 本文承接上文&#xff0c;将详细讲解指针概念。 一&#xff0c;通过指针了解变量的数值。 在将变量地址存入指针后&#xff0c;从指针反推也可以知道原变量的值&#xff0c;若想进行反退&#xff0c;就需要使用间接引用运算符&#xff1a;*。 语法&#x…

Redis 性能优化:多维度技术解析与实战策略

文章目录 1 基准性能2 使用 slowlog 优化耗时命令3 big key 优化4 使用 lazy free 特性5 缩短键值对的存储长度6 设置键值的过期时间7 禁用耗时长的查询命令8 使用 Pipeline 批量操作数据9 避免大量数据同时失效10 客户端使用优化11 限制 Redis 内存大小12 使用物理机而非虚拟机…

网络安全面试题汇总(个人经验)

1.谈一下SQL主从备份原理&#xff1f; 答&#xff1a;主将数据变更写入自己的二进制log,从主动去主那里去拉二进制log并写入自己的二进制log,从而自己数据库依据二进制log内容做相应变更。主写从读 2.linux系统中的计划任务crontab配置文件中的五个星星分别代表什么&#xff…

从AI生成内容到虚拟现实:娱乐体验的新边界

引言 在快速发展的科技时代&#xff0c;娱乐行业正经历一场前所未有的变革。传统的娱乐方式正与先进技术融合&#xff0c;创造出全新的沉浸式体验。从AI生成的个性化内容&#xff0c;到虚拟现实带来的身临其境的互动场景&#xff0c;科技不仅改变了我们消费娱乐的方式&#xf…

爬虫基础学习

什么是爬虫: 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;然后让其去互联网上抓取数据的过程。 爬虫的价值: 实际应用就业 爬虫究竟是合法还是违法的? 在法律中是不被禁止具有违法风险善意爬虫 恶意爬虫 爬虫带来的风险可以体现在如下方面: 爬虫干扰了被访问网…