代码之家  ›  专栏  ›  技术社区  ›  JokerMartini

QTreeView更改所选项目–显示文本

  •  0
  • JokerMartini  · 技术社区  · 7 年前

    当用户在UI中点击“编辑”时,如何更改treeview中选定行的第二列中显示的文本?我正在使用python和pyside,但我不清楚如何做到这一点。

    enter image description here

    import sys
    from PySide import QtGui, QtCore
    
    class SortModel(QtGui.QSortFilterProxyModel):
    
        def __init__(self, *args, **kwargs):
            super(SortModel, self).__init__(*args, **kwargs)
    
        def lessThan(self, left, right):
            leftData = self.sourceModel().data(left)
            rightData = self.sourceModel().data(right)
    
            if leftData:
                leftData = leftData.lower()
            if rightData:
                rightData = rightData.lower()
    
            print('L:', leftData, 'R:', rightData)
            return leftData < rightData
    
    
    class Browser(QtGui.QDialog):
        def __init__(self, parent=None):
            super(Browser, self).__init__(parent)
    
            self.initUI()
    
        def initUI(self):
            self.resize(200, 300)
            self.setWindowTitle('Assets')
            self.setModal(True)
    
            self.results = ""
    
            self.uiItems = QtGui.QTreeView()
            self.uiItems.setAlternatingRowColors(True)
            self.uiItems.setSortingEnabled(True)
            self.uiItems.sortByColumn(0, QtCore.Qt.AscendingOrder)
            self.uiItems.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
            self.uiItems.header().setResizeMode(QtGui.QHeaderView.ResizeToContents)
            self.uiItems.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
            self.uiItems.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
            self._model = self.create_model(self)
            self._spmodel = SortModel(self)
            self._spmodel.setSourceModel(self._model)
            self._spmodel.setDynamicSortFilter(False)
            self.uiItems.setModel(self._spmodel)
    
            self.uiEdit = QtGui.QPushButton('Edit')
    
            grid = QtGui.QGridLayout()
            grid.setContentsMargins(0, 0, 0, 0)
            grid.addWidget(self.uiItems, 0, 0)
            grid.addWidget(self.uiEdit, 1, 0)
            self.setLayout(grid)
    
            self.uiItems.doubleClicked.connect(self.doubleClickedItem)
            self.show()
    
        def doubleClickedItem(self, idx):
            name = idx.data(role=QtCore.Qt.DisplayRole)
            model = idx.model()
            model.setData(idx, 'great', role=QtCore.Qt.DisplayRole)
    
        def create_model(self, parent):
    
            items = [
                'Cookie dough',
                'Hummus',
                'Spaghetti',
                'Dal makhani',
                'Chocolate whipped cream'
            ]
    
            model = QtGui.QStandardItemModel()
            model.setHorizontalHeaderLabels(['Name', 'Great'])
    
            for item in items:
    
                root = []
                parentNode = QtGui.QStandardItem(item)
                root.append(parentNode)
    
                # add child row with 2 columns
                for i in range(3):
                    row = []
                    col1 = QtGui.QStandardItem()
                    col1.setData('COLUMN 1', role=QtCore.Qt.DisplayRole)
                    row.append(col1)
                    col2 = QtGui.QStandardItem()
                    col2.setData('COLUMN 2', role=QtCore.Qt.DisplayRole)
                    row.append(col2)           
                    parentNode.appendRow(row)
    
                model.appendRow(root)
    
            return model
    
        def showEvent(self, event):
            geom = self.frameGeometry()
            geom.moveCenter(QtGui.QCursor.pos())
            self.setGeometry(geom)
            super(Browser, self).showEvent(event)
    
        def keyPressEvent(self, event):
            if event.key() == QtCore.Qt.Key_Escape:
                # self.hide()
                self.close()
                event.accept()
            else:
                super(Browser, self).keyPressEvent(event)
    
    
    def main():
        app = QtGui.QApplication(sys.argv)
        ex = Browser()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Darklighter TheDarkKnight    7 年前

    连接按钮 clicked 信号,通过 model.selectedIndexes ,对其进行迭代,并仅处理具有 .column() == 1 就像你的 doubleClickedItem 作用

    您还可以更改 SelectionBehavior 仅选择单个项目而不是整行。