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

Raf*_*lok 7 python qt pyqt4 qtablewidget

我有以下代码定义我的应用程序的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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

Raf*_*lok 17

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

正如Sven在这个问题的第二个答案的评论中所提到的,如果你的QTableWidgetItem中有静态的行数和列数,你可以用Qtdesigner选择单元格的属性,如果你用它来为你的应用程序创建屏幕


ozc*_*nya 14

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

self.tableWidget.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
Run Code Online (Sandbox Code Playgroud)


Sve*_*ger 10

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

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

  • 也可以通过单击在Qt Designer中进行设置。 (2认同)

小智 6

如果您希望 UI 看起来相同(仍然可以选择,并变成蓝色,但不可编辑),我发现QtCore.Qt.ItemIsEditable效果很好。

item = QtWidgets.QTableWidgetItem()
item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable)
self.table_widget.setItem(row, column, item)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是最正确的。您不应该像其他答案一样设置标志,在其中删除所有其他标志。同时,您可以添加“^Qt.ItemIsSelectable”或“^Qt.ItemIsEnabled”来使该项目不可选择或禁用。 (2认同)