【问题标题】:how to make a cell in a QTableWidget read only?如何使 QTableWidget 中的单元格只读?
【发布时间】:2011-12-05 09:15:09
【问题描述】:

我有以下代码定义我的应用程序的 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 解决方案类似吗?

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

【问题讨论】:

  • c++ 和带有 Qt 的 python 代码之间通常很少有区别。你只需要调整语法,这段代码就会像魅力一样工作。
  • @madjar ...它确实像一个魅力:),我只需要找到声明标志的位置,我是python和qt的新手,需要一些时间才能使用给它

标签: python qt pyqt4 qtablewidget


【解决方案1】:

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

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 选择单元格的属性(如果您使用它来创建屏幕)你的申请

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这也可以在Qt Designer中通过点击设置。
    • 但是如果我想要复制而不是编辑的能力呢?
    • @walksignison 您仍然可以单击单元格以标记它们,然后按“Ctrl + C”。标记单元格的内容将被放入剪贴板。
    【解决方案3】:

    Sven Krüger's的回答一样,你也可以将这个方法用于PyQt5

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

    【讨论】:

      【解决方案4】:

      如果您希望 UI 看起来相同(让它仍然可以选择,变成蓝色,但只是不可编辑)我发现 QtCore.Qt.ItemIsEditable 提供了很好的结果。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 2019-07-26
        • 2021-02-01
        • 2017-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多