如何使 QTableWidget 中的单元格只读?

问题描述 投票:0回答:6

我有以下代码定义我的应用程序的 GUI

class Ui (object):
    def setupUi():
        self.tableName = QtGui.QTableWidget(self.layoutWidget_20)
        self.tableName.setObjectName(_fromUtf8("twHistoricoDisciplinas"))
        self.tableName.setColumnCount(4)
        self.tableName.setRowCount(3)

以及我的应用程序中的以下代码

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        self.ui = Ui()
        self.ui.setupUi(self)
        self.createtable()

    #creating a tw cell
    def cell(self,var=""):
            item = QtGui.QTableWidgetItem()
            item.setText(var)
            return item

    def createtable(self):
         rows = self.tableName.rowCount()
         columns = self.tableName.columnCount()
         for i in range(rows):
             for j in range(columns):
                 item = self.cell("text")
                 self.ui.tableName.setItem(i, j, item)

我希望能够添加新的行和列并编辑它们,但我想锁定一些单元格。 (我已经有扩展表格的代码) 如何使某些单元格只读,同时保持其他单元格读写? 我找到了这个链接如何使 QTableWidget 中的列只读?以及 C++ 中问题的解决方案,Python 解决方案是否类似?

编辑:从帖子中删除答案并粘贴为答案

python qt pyqt4 qtablewidget
6个回答
32
投票

我玩了一下代码并阅读了更多文档 问题的答案是

def createtable(self):
     rows = self.tableName.rowCount()
     columns = self.tableName.columnCount()
     for i in range(rows):
         for j in range(columns):
             item = self.cell("text")
             # execute the line below to every item you need locked
             item.setFlags(QtCore.Qt.ItemIsEnabled)
             self.ui.tableName.setItem(i, j, item)

解决方案是“item.setFlags(QtCore.Qt.ItemIsEnabled)”行,您使用它来将单元格属性QtCore.Qt.ItemIsEnabled设置为禁用,这样您就无法选择或编辑单元格

您可以在运行时按照 Qt::ItemFlag 部分下的http://doc.qt.io/archives/qt-4.8/qt.html 上的文档以这种方式更改许多其他属性。

正如 Sven 在对此问题的第二个答案的评论中提到的,如果 QTableWidgetItem 中有静态数量的行和列,则可以使用 Qtdesigner 选择单元格的属性(如果您使用 Qtdesigner 为应用程序创建屏幕)


24
投票
当没有编辑触发器时,永远不会进入 QTableWidgetItem 的编辑状态:

self.tableName.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)


    


20
投票
就像

Sven Krüger's 的答案一样,您也可以将此方法用于 PyQt5

self.tableWidget.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
    

6
投票
如果您希望 UI 看起来相同(仍然可以选择,并变成蓝色,但不可编辑),我发现

QtCore.Qt.ItemIsEditable

 给出了很好的结果。

item = QtWidgets.QTableWidgetItem() item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) self.table_widget.setItem(row, column, item)
    

3
投票
对于 PyQt6,它与 @ozcanyarimdunya 相同,但带有枚举

EditTrigger

:

self.tableWidget.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
    

0
投票
如果您想让整个表格不可编辑,请尝试以下操作:

for row in range(self.employess.rowCount()): for col in range(self.employess.columnCount()): self.tableName.item(row,col).setFlags(Qt.ItemFlag.ItemIsEditable) self.tableName.item(row,col).setFlags(Qt.ItemFlag.ItemIsEditable) self.tableName.item(row,col).setFlags(Qt.ItemFlag.ItemIsEditable) self.tableName.item(row,col).setFlags(Qt.ItemFlag.ItemIsEditable) self.tableName.item(row,col).setFlags(Qt.ItemFlag.ItemIsEditable) self.tableName.item(row,col).setFlags(Qt.ItemFlag.ItemIsEditable)
    
© www.soinside.com 2019 - 2024. All rights reserved.