Я хочу сделать TreeView где элементы верхнего уровня охватывают все столбцы (например, они имеют одну строку), в то время как дети охватывают несколько столбцов (например, у них есть несколько строк.)охватывающих несколько столбцов, используя QTreeView и QAbstractItemModel
Я пытался выполнить это с помощью QTreeView.setFirstColumnSpanned. Тем не менее, я не могу понять, где/когда называть это (и, возможно, я начну с совершенно неправильных действий).
Я подумал, может быть, я мог бы сделать функцию на мой взгляд, которая будет называться после заполнения представления, для проверки любых элементов, которые должны обновлять их интервалы.
Однако я не смог найти каких-либо сигналов для подключения к тому, что может помочь мне сделать это (я попробовал несколько, но ни один из них никогда не казалось, огонь.)
Я также попытался реализовав InsertRows в моей модели и/or rowsInserted в моем представлении, но они никогда не вызываются.
Вот очень упрощенный вариант того, что я делаю:
class MyModel(QtCore.QAbstractItemModel):
def __init__(self, top_level_nodes):
QtCore.QAbstractItemModel.__init__(self)
self.top_level_nodes = top_level_nodes
self.columns = 5
def columnCount(self, parent):
return self.columns
def rowCount(self, parent):
total = len(self.top_level_nodes)
for node in self.top_level_nodes:
total += len(node.subnodes)
return total
def data(self, index, role):
if not index.isValid():
return QtCore.QVariant()
if role == QtCore.Qt.DisplayRole:
obj = index.internalPointer()
return obj.name
return QtCore.QVariant()
def index(self, row, column, parent):
if not parent.isValid():
if row > (len(self.top_level_nodes) - 1):
return QtCore.QModelIndex()
return self.createIndex(row, column, self.top_level_nodes[row])
return QtCore.QModelIndex()
def parent(self, index):
if not index.isValid():
return QtCore.QModelIndex()
node = index.internalPointer()
if node.parent is None:
return QtCore.QModelIndex()
else:
return self.createIndex(node.parent.row, 0, node.parent)
class FakeEntry(object):
def __init__(self, name, row, children=[]):
self.parent = None
self.row = row
self.name = 'foo'
self.subnodes = children
class MainWindow(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.resize(800, 600)
self.layout = QtGui.QVBoxLayout(self)
self.tree_view = QtGui.QTreeView(self)
self.layout.addWidget(self.tree_view)
entry = FakeEntry('foo', 0, children=[])
self.model = MyModel([entry])
self.tree_view.setModel(self.model)
def main():
app = QtGui.QApplication(sys.argv)
frame = MainWindow()
frame.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Этот код работает отлично. Что мне нужно знать:
Как я могу создать запись, созданную FakeEntry, для всех 5 столбцов вместо создания 5 одинаковых ячеек?
Другие вопросы:
- Могу ли я переописать QAbstractItemModel.insertRows или QTreeView.rowsInserted? Есть ли «трюк» для этого, что мне не хватает, что заставляет мой код забрать реализацию по умолчанию?
- Что на самом деле обрабатывает создание строк/столбцов в представлении, как только модель заполнена данными и прикреплена к виду?
Да, это полностью работает. Благодаря!! – almaghest