22

我有以下代码定义我的应用程序的 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)

我希望能够添加新的行和列并对其进行编辑,但我想锁定一些单元格。(我已经有扩展表格的代码)如何使某些单元格只读而其他单元格保持读写?我找到了这个链接How to make a column in QTableWidget read only? 使用 C++ 解决问题,python 解决方案是否相似?

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

4

5 回答 5

30

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

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 为禁用,所以你不能选择或编辑单元格

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

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

于 2011-10-13T15:32:26.233 回答
21

当没有 Edit Triggers 时,永远不会进入 QTableWidgetItem 的编辑状态:

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

于 2017-02-10T09:56:52.840 回答
17

就像Sven Krüger 的回答一样,您也可以将此方法用于PyQt5

self.tableWidget.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
于 2018-04-20T22:01:01.913 回答
2

如果你想让 UI 看起来一样(让它仍然可以选择,变成蓝色,但只是不可编辑),我发现QtCore.Qt.ItemIsEditable效果很好。

item = QtWidgets.QTableWidgetItem()
item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable)
self.table_widget.setItem(row, column, item)
于 2021-10-06T06:57:00.180 回答
0

对于 PyQt6,它与 @ozcanyarimdunya 相同,但带有 enum EditTrigger

self.tableWidget.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
于 2022-02-24T03:38:40.037 回答