На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > [PyQt] Отображение, сортировка, доступ к данным в QTreeView.
      Здравствуйте. В приложении была необходимость выводить данные в виде списка со столбцами, для этого отлично подходил QTreeWidget, но затем понадобилась расширенная сортировка данных. После изучения методов решения выяснил, что аналогичное отображение данных + сортировку можно получить с помощью QTreeView + QSortFilterProxyModel + QStandardItemModel. В приложении используется примерно такая схема:
      ExpandedWrap disabled
        # -*- 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. Как правильно получать исходные данные?
      сейчас для того чтобы получить данные какого-либо столбца при выборе строки в списке использую код:
      ExpandedWrap disabled
        def on_treeView_pressed(self, current):
            data = current.sibling(current.row(), 0).data(QtCore.Qt.DisplayRole)

      2. Необходимо реализовать такое поведение: например, если значение в строке в столбце 2 больше, чем в столбце 1, то надо выделить всю строку жирным шрифтом. Пробовал в классе, наследованном от QSortFilterProxyModel переопределить метод data, но там соответственно столкнулся с проблемой выборки данных, максимум что получалось - это то, что нужные строки выделялись жирным, но список переставал сортироваться, видимо потому, что данные выдирал прямо из QStandardItemModel, получалось так, что они выводятся в QTreeView в таком порядке, в котором они находятся в QStandardItemModel .
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0415 ]   [ 15 queries used ]   [ Generated: 3.05.24, 00:04 GMT ]