
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.2.160] |
![]() |
|
Сообщ.
#1
,
|
|
|
Здравствуйте. В приложении была необходимость выводить данные в виде списка со столбцами, для этого отлично подходил QTreeWidget, но затем понадобилась расширенная сортировка данных. После изучения методов решения выяснил, что аналогичное отображение данных + сортировку можно получить с помощью QTreeView + QSortFilterProxyModel + QStandardItemModel. В приложении используется примерно такая схема:
![]() ![]() # -*- encoding: utf-8 -*- from PyQt4 import QtGui, QtCore import sys cNAME, cVALUE = range(2) class SortModel(QtGui.QSortFilterProxyModel): def lessThan(self, left, right): leftData = self.sourceModel().data(left) rightData = self.sourceModel().data(right) if self.sortColumn() == cVALUE: return int(leftData) < int(rightData) else: return leftData < rightData class MainWindow(QtGui.QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.centralWidget = QtGui.QWidget() self.setCentralWidget(self.centralWidget) self.modelData = QtGui.QStandardItemModel(0, 2) self.modelData.setHorizontalHeaderLabels(['Столбец1', 'Столбец2']) self.modelData.appendRow([QtGui.QStandardItem('10'), QtGui.QStandardItem('2')]) self.modelData.appendRow([QtGui.QStandardItem('20'), QtGui.QStandardItem('40')]) self.modelData.appendRow([QtGui.QStandardItem('3'), QtGui.QStandardItem('7')]) self.sortModel = SortModel() self.sortModel.setDynamicSortFilter(True) self.sortModel.setSortCaseSensitivity(False) self.sortModel.setSourceModel(self.modelData) self.treeView = QtGui.QTreeView(self.centralWidget) self.treeView.setGeometry(QtCore.QRect(10,10, 430,300)) self.treeView.setModel(self.sortModel) self.treeView.setSortingEnabled(True) mainLayout = QtGui.QVBoxLayout() mainLayout.addWidget(self.treeView) self.setLayout(mainLayout) self.resize(500, 450) app = QtGui.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) И тут возникли следующие вопросы: 1. Как правильно получать исходные данные? сейчас для того чтобы получить данные какого-либо столбца при выборе строки в списке использую код: ![]() ![]() def on_treeView_pressed(self, current): data = current.sibling(current.row(), 0).data(QtCore.Qt.DisplayRole) 2. Необходимо реализовать такое поведение: например, если значение в строке в столбце 2 больше, чем в столбце 1, то надо выделить всю строку жирным шрифтом. Пробовал в классе, наследованном от QSortFilterProxyModel переопределить метод data, но там соответственно столкнулся с проблемой выборки данных, максимум что получалось - это то, что нужные строки выделялись жирным, но список переставал сортироваться, видимо потому, что данные выдирал прямо из QStandardItemModel, получалось так, что они выводятся в QTreeView в таком порядке, в котором они находятся в QStandardItemModel . |