QSortFilterProxyModel 隐藏 QWidget
QSortFilterProxyModel hiding QWidget
我有一个 QStandardItemModel
可以容纳数据。在其中一列中,我想添加一些 QWidget
s(可点击的图片)。然而,在出于 soring/filtering 目的添加 QSortFilterProxyModel
之后,QSortFilterProxyModel
隐藏了我想要的 QWidget
s。
我在网上搜索过,但找不到如何同时保留 QWidget
和 QSortFilterProxyModel
的方法。如果有人可以在这个问题上指导我,我将不胜感激。谢谢。
一个最小的例子,根据我的需要使用 QPushButton
QWidget
:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Buttons(QWidget):
def __init__(self):
super().__init__()
layout = QHBoxLayout(self)
layout.addWidget(QPushButton('btn1'))
layout.addWidget(QPushButton('btn2'))
self.setLayout(layout)
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
tab = QTableView()
sti = QStandardItemModel()
if True: # This shows the buttons in a cell
tab.setModel(sti)
else: # This does not show the buttons
proxy = QSortFilterProxyModel()
proxy.setSourceModel(sti)
tab.setModel(proxy)
sti.appendRow([QStandardItem(str(i)) for i in range(5)])
tab.setIndexWidget(sti.index(0, 0), QPushButton("hi"))
sti.appendRow([])
tab.setIndexWidget(sti.index(1, 2), Buttons())
self.setCentralWidget(tab)
app = QApplication([])
window = MainWindow()
window.resize(800, 600)
window.show()
app.exec_()
使用 seyIndexWidget
添加的小部件被添加到 视图 ,而不是模型。传递给函数的索引只是视图用来知道这些小部件将放置在哪里的引用,并且该引用必须是视图中使用的实际模型的引用。
如果您在视图中使用代理模型,则必须提供代理的索引,而不是源的索引。
tab.setIndexWidget(proxy.index(0, 0), QPushButton("hi"))
或者,更好:
tab.setIndexWidget(tab.model().index(0, 0), QPushButton("hi"))
请注意,这显然意味着当模型因过滤或排序而改变时,您可能会遇到一些不一致的情况,这是索引小部件应仅用于静态和简单模型的另一个原因,委托是首选解决方案。
我有一个 QStandardItemModel
可以容纳数据。在其中一列中,我想添加一些 QWidget
s(可点击的图片)。然而,在出于 soring/filtering 目的添加 QSortFilterProxyModel
之后,QSortFilterProxyModel
隐藏了我想要的 QWidget
s。
我在网上搜索过,但找不到如何同时保留 QWidget
和 QSortFilterProxyModel
的方法。如果有人可以在这个问题上指导我,我将不胜感激。谢谢。
一个最小的例子,根据我的需要使用 QPushButton
QWidget
:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Buttons(QWidget):
def __init__(self):
super().__init__()
layout = QHBoxLayout(self)
layout.addWidget(QPushButton('btn1'))
layout.addWidget(QPushButton('btn2'))
self.setLayout(layout)
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
tab = QTableView()
sti = QStandardItemModel()
if True: # This shows the buttons in a cell
tab.setModel(sti)
else: # This does not show the buttons
proxy = QSortFilterProxyModel()
proxy.setSourceModel(sti)
tab.setModel(proxy)
sti.appendRow([QStandardItem(str(i)) for i in range(5)])
tab.setIndexWidget(sti.index(0, 0), QPushButton("hi"))
sti.appendRow([])
tab.setIndexWidget(sti.index(1, 2), Buttons())
self.setCentralWidget(tab)
app = QApplication([])
window = MainWindow()
window.resize(800, 600)
window.show()
app.exec_()
使用 seyIndexWidget
添加的小部件被添加到 视图 ,而不是模型。传递给函数的索引只是视图用来知道这些小部件将放置在哪里的引用,并且该引用必须是视图中使用的实际模型的引用。
如果您在视图中使用代理模型,则必须提供代理的索引,而不是源的索引。
tab.setIndexWidget(proxy.index(0, 0), QPushButton("hi"))
或者,更好:
tab.setIndexWidget(tab.model().index(0, 0), QPushButton("hi"))
请注意,这显然意味着当模型因过滤或排序而改变时,您可能会遇到一些不一致的情况,这是索引小部件应仅用于静态和简单模型的另一个原因,委托是首选解决方案。