【问题标题】:Make QTreeview's Column Editable in Pyside使 QTreeview 的列在 Pyside 中可编辑
【发布时间】:2023-03-16 17:38:02
【问题描述】:

如何使 QTreeView 的第二列可编辑,以便用户更改名称?

import sys
import os
import random
from PySide import QtGui, QtCore

class ID_Asset(object):
    def __init__(self, buffer_id=0, name='', nodes=[]):
        self.buffer_id = buffer_id
        self.name = name if name else 'unknown'
        self.nodes = nodes if nodes is not None else []
        self.color = QtGui.QBrush(QtGui.QColor(0, 0, 0, 255))

        self.randomize_color()

    def randomize_color(self):
        r = random.randrange(0, 255)
        g = random.randrange(0, 255)
        b = random.randrange(0, 255)

        self.color = QtGui.QBrush(QtGui.QColor(r, g, b, 255))


class ObjectIDManager(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(ObjectIDManager, self).__init__(parent)

        self.TITLE = 'Object ID Manager'
        self.VERSION = "1.0.0" # MAJOR.MINOR.PATCH
        self.resize(270, 500)
        self.setWindowTitle(self.TITLE + " | " + self.VERSION)
        self.init_ui()

    def init_ui(self):

        # variables
        self.assets = []
        self.handlers = []

        self.items_model = QtGui.QStandardItemModel()
        self.ui_items = QtGui.QTreeView()
        # self.ui_items.setAlternatingRowColors(True)
        self.ui_items.setSortingEnabled(True)
        self.ui_items.setAllColumnsShowFocus(True)
        self.ui_items.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.ui_items.header().setResizeMode(QtGui.QHeaderView.ResizeToContents)
        self.ui_items.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.ui_items.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.ui_items.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        # self.ui_items.customContextMenuRequested.connect(self.open_menu)
        self.ui_items.sortByColumn(0, QtCore.Qt.AscendingOrder)
        self.ui_items.setModel(self.items_model)
        self.ui_items.setRootIsDecorated(False)

        gbox = QtGui.QGridLayout()
        gbox.setContentsMargins(10, 10, 10, 10)
        gbox.addWidget(self.ui_items)

        # main layout
        main_widget = QtGui.QWidget()
        main_widget.setLayout(gbox)
        self.setCentralWidget(main_widget)

        # signals
        self.initialize()

    # functions
    def initialize(self):
        self.process_model()

    def process_model(self):
        model = self.ui_items.model()
        model.clear()
        headers = ['ID', 'Name', 'Used', 'Color']
        model.setHorizontalHeaderLabels(headers)

        self.collect_assets()

        for x in self.assets:
            model.insertRow(0)

            # Append object
            model.setData(model.index(0, 0), x, role=QtCore.Qt.UserRole)
            model.setData(model.index(0, 0), x.buffer_id)
            model.setData(model.index(0, 1), x.name)
            model.setData(model.index(0, 2), len(x.nodes))
            model.setData(model.index(0, 3), x.color, QtCore.Qt.BackgroundRole)

            # item = model.itemFromIndex(model.index(0,0))

        self.ui_items.sortByColumn(0, QtCore.Qt.AscendingOrder)

    def collect_assets(self):
        ids = {
            0: ['a','b','c'],
            1: ['a','b','c','j'],
            30: ['b','c'],
            45: ['a',],
            60: ['a','b','c','d','e','f']
        }

        self.assets = []

        for key, value in ids.items():
            new_asset = ID_Asset(buffer_id=key, nodes=value)
            self.assets.append(new_asset)

        return self.assets

# Main
# -----------------------------------------------------------------------------
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = ObjectIDManager()
    window.show()
    app.exec_()

【问题讨论】:

    标签: python qt pyside qtreeview


    【解决方案1】:

    你不应该使用:

    {Your QTreeView}.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)

    因为您无法编辑任何项目。

    您必须逐个元素放置可编辑属性,即{your QStandardItem}.setEditable({your value})

    在你的情况下添加:

    model.item(0, 0).setEditable(False)
    model.item(0, 1).setEditable(True)
    model.item(0, 2).setEditable(False)
    model.item(0, 3).setEditable(False)
    

    之后

    ...
    model.setData(model.index(0, 0), x, role=QtCore.Qt.UserRole)
    model.setData(model.index(0, 0), x.buffer_id)
    model.setData(model.index(0, 1), x.name)
    model.setData(model.index(0, 2), len(x.nodes))
    model.setData(model.index(0, 3), x.color, QtCore.Qt.BackgroundRole)
    ....
    

    完整代码:

    import sys
    import os
    import random
    from PySide import QtGui, QtCore
    
    class ID_Asset(object):
        def __init__(self, buffer_id=0, name='', nodes=[]):
            self.buffer_id = buffer_id
            self.name = name if name else 'unknown'
            self.nodes = nodes if nodes is not None else []
            self.color = QtGui.QBrush(QtGui.QColor(0, 0, 0, 255))
    
            self.randomize_color()
    
        def randomize_color(self):
            r = random.randrange(0, 255)
            g = random.randrange(0, 255)
            b = random.randrange(0, 255)
    
            self.color = QtGui.QBrush(QtGui.QColor(r, g, b, 255))
    
    
    class ObjectIDManager(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(ObjectIDManager, self).__init__(parent)
    
            self.TITLE = 'Object ID Manager'
            self.VERSION = "1.0.0" # MAJOR.MINOR.PATCH
            self.resize(270, 500)
            self.setWindowTitle(self.TITLE + " | " + self.VERSION)
            self.init_ui()
    
        def init_ui(self):
    
            # variables
            self.assets = []
            self.handlers = []
    
            self.items_model = QtGui.QStandardItemModel()
            self.ui_items = QtGui.QTreeView()
            # self.ui_items.setAlternatingRowColors(True)
            self.ui_items.setSortingEnabled(True)
            self.ui_items.setAllColumnsShowFocus(True)
            # self.ui_items.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
            self.ui_items.header().setResizeMode(QtGui.QHeaderView.ResizeToContents)
            self.ui_items.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
            self.ui_items.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
            self.ui_items.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
            # self.ui_items.customContextMenuRequested.connect(self.open_menu)
            self.ui_items.sortByColumn(0, QtCore.Qt.AscendingOrder)
            self.ui_items.setModel(self.items_model)
            self.ui_items.setRootIsDecorated(False)
    
            gbox = QtGui.QGridLayout()
            gbox.setContentsMargins(10, 10, 10, 10)
            gbox.addWidget(self.ui_items)
    
            # main layout
            main_widget = QtGui.QWidget()
            main_widget.setLayout(gbox)
            self.setCentralWidget(main_widget)
    
            # signals
            self.initialize()
    
        # functions
        def initialize(self):
            self.process_model()
    
        def process_model(self):
            model = self.ui_items.model()
            model.clear()
            headers = ['ID', 'Name', 'Used', 'Color']
            model.setHorizontalHeaderLabels(headers)
    
            self.collect_assets()
    
            for x in self.assets:
                model.insertRow(0)
                # Append object
                model.setData(model.index(0, 0), x, role=QtCore.Qt.UserRole)
                model.setData(model.index(0, 0), x.buffer_id)
                model.setData(model.index(0, 1), x.name)
                model.setData(model.index(0, 2), len(x.nodes))
                model.setData(model.index(0, 3), x.color, QtCore.Qt.BackgroundRole)
    
                model.item(0, 0).setEditable(False)
                model.item(0, 1).setEditable(True)
                model.item(0, 2).setEditable(False)
                model.item(0, 3).setEditable(False)
    
    
    
    
                # item = model.itemFromIndex(model.index(0,0))
    
            self.ui_items.sortByColumn(0, QtCore.Qt.AscendingOrder)
    
        def collect_assets(self):
            ids = {
                0: ['a','b','c'],
                1: ['a','b','c','j'],
                30: ['b','c'],
                45: ['a',],
                60: ['a','b','c','d','e','f']
            }
    
            self.assets = []
    
            for key, value in ids.items():
                new_asset = ID_Asset(buffer_id=key, nodes=value)
                self.assets.append(new_asset)
    
            return self.assets
    
    # Main
    # -----------------------------------------------------------------------------
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        window = ObjectIDManager()
        window.show()
        app.exec_()
    

    输出:

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      相关资源
      最近更新 更多