【问题标题】:QSortFilterProxyModel hiding QWidgetQSortFilterProxyModel 隐藏 QWidget
【发布时间】:2020-11-21 21:47:59
【问题描述】:

我有一个容纳数据的QStandardItemModel。在其中一个专栏中,我想添加一些QWidgets(可点击图片)。然而,在添加QSortFilterProxyModel 用于排序/过滤目的之后,QSortFilterProxyModel 隐藏了我想要的QWidgets。

我搜索了互联网,但找不到如何同时保留QWidgetQSortFilterProxyModel。如果有人可以在这个问题上指导我,将不胜感激。谢谢。

一个最小的例子,使用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_()

【问题讨论】:

    标签: python pyqt5 qsortfilterproxymodel


    【解决方案1】:

    使用seyIndexWidget 添加的小部件被添加到视图,而不是模型。传递给函数的索引只是视图用来知道这些小部件将放置在哪里的引用,并且该引用必须是视图中使用的实际模型的引用。

    如果您在视图中使用代理模型,则必须提供代理的索引,而不是源的索引。

    tab.setIndexWidget(proxy.index(0, 0), QPushButton("hi"))
    

    或者,更好:

    tab.setIndexWidget(tab.model().index(0, 0), QPushButton("hi"))
    

    请注意,这显然意味着每当模型因过滤或排序而发生更改时,您可能会遇到一些不一致的情况,这也是索引小部件应仅用于静态和简单模型的另一个原因,而委托是首选解决方案。

    【讨论】:

      猜你喜欢
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多