多个标签页中复用同一 QTableView

在 PyQt 中实现在多个标签页中复用同一个 QTableView 实例,复用同一个 QTableView 实例可以减少内存和资源的使用。每个 QTableView 实例都会消耗一定的内存和处理资源,如果每个标签页都创建一个新的实例,会增加系统的负担。通过复用实例,可以显著降低资源消耗,提升应用程序的性能。

1、问题背景

在使用 PyQt5 开发 GUI 程序时,有时需要在多个标签页中显示相同的数据。为了提高性能,希望使用同一个 QTableView 来显示不同标签页中的数据,只需过滤数据即可。

2、解决方案

经过调研,发现 QTableView 不支持在多个标签页中复用。最优雅的解决方案是为每个标签页创建一个独立的 QTableView。

代码例子1创建独立的 QTableView

python 复制代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QTableView, QVBoxLayout, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Multiple TableViews in Tabs")
        self.resize(640, 480)

        # Create a QTabWidget to hold the tabs
        self.tabs = QTabWidget()

        # Create a QTableView for each tab
        self.tableView1 = QTableView()
        self.tableView2 = QTableView()

        # Add the table views to the tabs
        self.tabs.addTab(self.tableView1, "Tab 1")
        self.tabs.addTab(self.tableView2, "Tab 2")

        # Set the central widget to the tab widget
        self.setCentralWidget(self.tabs)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

代码例子2使用同一个 QTableView 过滤数据

由于 QTableView 不支持在多个标签页中复用,因此如果需要在多个标签页中显示相同的数据,但需要过滤数据,可以使用以下方法:

  1. 创建一个 QAbstractItemModel,该模型包含所有数据。
  2. 为每个标签页创建 QTableView,并使用相同的 QAbstractItemModel。
  3. 为每个 QTableView 设置不同的数据过滤器,以便只显示所需的数据。
python 复制代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QTableView, QVBoxLayout, QPushButton, QSortFilterProxyModel

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Multiple TableViews with Filtered Data")
        self.resize(640, 480)

        # Create a QTabWidget to hold the tabs
        self.tabs = QTabWidget()

        # Create a QAbstractItemModel to hold the data
        self.model = QAbstractItemModel()

        # Create QTableViews for each tab
        self.tableView1 = QTableView()
        self.tableView2 = QTableView()

        # Create QSortFilterProxyModels for each table view
        self.proxyModel1 = QSortFilterProxyModel()
        self.proxyModel2 = QSortFilterProxyModel()

        # Set the source model for the proxy models
        self.proxyModel1.setSourceModel(self.model)
        self.proxyModel2.setSourceModel(self.model)

        # Set the proxy models for the table views
        self.tableView1.setModel(self.proxyModel1)
        self.tableView2.setModel(self.proxyModel2)

        # Set the filters for the proxy models
        self.proxyModel1.setFilterKeyColumn(0)
        self.proxyModel1.setFilterFixedString("Tab 1")
        self.proxyModel2.setFilterKeyColumn(0)
        self.proxyModel2.setFilterFixedString("Tab 2")

        # Add the table views to the tabs
        self.tabs.addTab(self.tableView1, "Tab 1")
        self.tabs.addTab(self.tableView2, "Tab 2")

        # Set the central widget to the tab widget
        self.setCentralWidget(self.tabs)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

通过这种方法,你可以在 PyQt 应用程序中轻松地在多个标签页中复用同一个 QTableView 实例,并根据需要对每个标签页的视图进行自定义配置和操作。

相关推荐
倔强的石头_9 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
阿巴斯甜15 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker15 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952716 小时前
Andorid Google 登录接入文档
android
黄林晴18 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
xiezhr18 小时前
米哈游36岁程序员被曝复工当晚猝死出租屋内
游戏·程序员·游戏开发
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android