Mam QStandardItemModel, który pomiedza dane. W jednej z kolumn chciałbym dodać trochę QWidget s (klikalne zdjęcia). Po dodaniu QSortFilterProxyModel do sorowania / celu filtrowania, jednak QSortFilterProxyModel ukrywa mój pożądany QWidget s.

Przeszukałem w Internecie, ale nie można znaleźć, jak zachować jednocześnie QWidget i QSortFilterProxyModel. Byłoby bardzo doceniane, jeśli ktoś może mnie poprowadzić w tej kwestii. Dzięki.

Minimalny przykład, używając QPushButton jako mój pożądany 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_()
0
Boba S. 21 listopad 2020, 08:51

1 odpowiedź

Najlepsza odpowiedź

Widżety dodane przy użyciu seyIndexWidget są dodawane do widoku , a nie do modelu. Indeks przekazany do funkcji jest tylko odniesieniem, który widok wykorzystuje, aby wiedzieć, gdzie pojawi się widget, a to odniesienie musi być rzeczywistym modelem używanym w widoku.

Jeśli używasz modelu proxy w widoku, musisz podać indeks proxy, a nie źródła.

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

Albo lepiej:

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

Zauważ, że to oczywiście oznacza, że możesz zmierzyć się z pewną niespójnością, gdy model zostanie zmieniony z powodu filtrowania lub sortowania, a to kolejny powód, dla którego widżety indeksu powinny być używane tylko w modelach statycznych i prostych, a delegatami są preferowanym rozwiązaniem.

0
musicamante 21 listopad 2020, 12:09