在 PyQt 中实现在多个标签页中复用同一个 QTableView
实例,复用同一个 QTableView
实例可以减少内存和资源的使用。每个 QTableView
实例都会消耗一定的内存和处理资源,如果每个标签页都创建一个新的实例,会增加系统的负担。通过复用实例,可以显著降低资源消耗,提升应用程序的性能。
1、问题背景
在使用 PyQt5 开发 GUI 程序时,有时需要在多个标签页中显示相同的数据。为了提高性能,希望使用同一个 QTableView 来显示不同标签页中的数据,只需过滤数据即可。
2、解决方案
经过调研,发现 QTableView 不支持在多个标签页中复用。最优雅的解决方案是为每个标签页创建一个独立的 QTableView。
代码例子1:创建独立的 QTableView
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 不支持在多个标签页中复用,因此如果需要在多个标签页中显示相同的数据,但需要过滤数据,可以使用以下方法:
- 创建一个 QAbstractItemModel,该模型包含所有数据。
- 为每个标签页创建 QTableView,并使用相同的 QAbstractItemModel。
- 为每个 QTableView 设置不同的数据过滤器,以便只显示所需的数据。
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
实例,并根据需要对每个标签页的视图进行自定义配置和操作。