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

28 投票
6 回答
52287 浏览
提问于 2025-04-17 04:05

我有以下代码,用来定义我应用的界面

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的解决方案类似吗?

编辑:我把帖子中的答案删掉了,重新粘贴成了一个答案

6 个回答

22

就像Sven Krüger的回答一样,你也可以使用这些方法来处理PyQt5

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

当没有设置编辑触发器时,QTableWidgetItem的编辑状态是不会被激活的:

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

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)",这个代码的作用是把单元格的属性设置为不可用,这样你就不能选择或编辑这个单元格了。

你可以通过这种方式在运行时更改其他许多属性,具体可以参考http://doc.qt.io/archives/qt-4.8/qt.html中关于Qt::ItemFlag的部分。

正如Sven在这个问题的第二个回答中提到的,如果你的QTableWidgetItem的行和列数量是固定的,你可以使用Qt Designer来选择单元格的属性,这样可以帮助你创建应用程序的界面。

撰写回答