如何禁用 QtableView pyqt 中的某些列?

Posted

技术标签:

【中文标题】如何禁用 QtableView pyqt 中的某些列?【英文标题】:how can disable some column in QtableView pyqt? 【发布时间】:2014-04-05 21:15:37 【问题描述】:

我想填充一个 tableView 但我想禁用某些列,这样用户就无权修改其内容。

def remplissageTableView(self):

        headers=["Janvier", "fevrier","Mars","Avril","Mai","Juin","Juillet", "Aout","Septembre","Octobre","Novembre","Decembre"]
        rows=[]
        for i in range(5) :
            row = ["","","","","","","","","","","",""]
            rows.append(row)
        model =PrevisionTableModel(rows,headers) 
        self.tableView.setModel(model)

我最初想要一个tableView 12 column 5 line 有点笨的解决办法:p

【问题讨论】:

【参考方案1】:

使用proxy model 控制桌子模型上的flags:

class ProxyModel(QtGui.QIdentityProxyModel):
    def __init__(self, parent=None):
        super(ProxyModel, self).__init__(parent)
        self._columns = set()

    def columnReadOnly(self, column):
        return column in self._columns

    def setColumnReadOnly(self, column, readonly=True):
        if readonly:
            self._columns.add(column)
        else:
            self._columns.discard(column)

    def flags(self, index):
        flags = super(ProxyModel, self).flags(index)
        if self.columnReadOnly(index.column()):
            flags &= ~QtCore.Qt.ItemIsEditable
        return flags

...
model = PrevisionTableModel(rows, headers) 
self.proxy = ProxyModel(self)
self.proxy.setSourceModel(model)
self.tableView.setModel(self.proxy)
self.tableView.model().setColumnReadOnly(3, True)

【讨论】:

以上是关于如何禁用 QtableView pyqt 中的某些列?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 QTableView:如何在保持默认样式/颜色的同时禁用用户交互/选择?

PyQt:如何在 QTableView 中的光标处插入文本

PyQt:如何调整 QTableView 标题大小/列宽

PyQt4 - QTableView - 如何循环 QTableView

PyQt4中的QTableView选定元素

PyQt:Windows Vista/7 上 QTableView 中的 QStyledItemDelegate?