Как добавить виджеты в каждую ячейку qtableView с дизайном MVC? - PullRequest
0 голосов
/ 28 сентября 2018

Вот простой пример qtableView, где каждая ячейка имеет свой элемент.В приведенном здесь примере я использовал числа, но в конечном итоге я хочу отобразить анимированные GIF-изображения для каждой ячейки.Я хочу сохранить дизайн MVC и процедурно вставить собственный виджет.

import random
import math
from PyQt4 import QtCore, QtGui

class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data, columns, parent=None):
        super(TableModel, self).__init__(parent)
        self._columns = columns
        self._data = data[:]

    def rowCount(self, parent=QtCore.QModelIndex()): 
        if parent.isValid() or self._columns == 0:
            return 0
        return math.ceil(len(self._data )*1.0/self._columns)

    def columnCount(self, parent=QtCore.QModelIndex()): 
        if parent.isValid():
            return 0
        return self._columns

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if not index.isValid(): 
            return
        if role == QtCore.Qt.DisplayRole: 
            try:
                value = self._data[ index.row() * self._columns + index.column() ]
                return value
            except:
                pass

class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        data = [random.choice(range(10)) for i in range(20)]

        l = QtGui.QHBoxLayout(self)
        splitter = QtGui.QSplitter()
        l.addWidget(splitter)

        tvf = QtGui.QTableView()
        model = TableModel(data, 3, self)
        tvf.setModel(model)

        splitter.addWidget( tvf )


if __name__=="__main__":
    import sys
    a=QtGui.QApplication(sys.argv)
    w=Widget()
    w.show()
    sys.exit(a.exec_())

Прочитав немного больше и с помощью @eyllanesc, я понимаю, что есть 2 способа достижения этого: делегаты или itemWidget,Кажется, что делегаты не будут работать для меня, так как невозможно вставить виджет в ячейки таким образом.ItemWidget кажется правильным, но это не совместимо с MVC?я не хочу зацикливать функцию для вставки в таблицу ...

есть третий способ?

...