Python QTableview checkitems,从相应的第二列获取值

Python QTableview checkitems,从相应的第二列获取值,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,关于QTableView,我有两个问题 如何使QTable仅对第二列值可编辑,而对第一列值为只读 如何获取选中项的索引,以便获取对应于选中项的第二列的值 from PyQt5 import QtWidgets, QtGui class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent=parent) # selected ite

关于
QTableView
,我有两个问题

  • 如何使QTable仅对第二列值可编辑,而对第一列值为只读

  • 如何获取选中项的索引,以便获取对应于选中项的第二列的值

    from PyQt5 import QtWidgets, QtGui
    
    class MyWidget(QtWidgets.QWidget):
    
        def __init__(self, parent=None):
            super().__init__(parent=parent)
    
            # selected items
            self.selected = []
            self.no       = []
    
            self.tableModel = QtGui.QStandardItemModel(self)
            self.tableModel.itemChanged.connect(self.itemChanged)
            # 
            item1 = QtGui.QStandardItem("file#1")
            item1.setCheckable(True)
            no1 = QtGui.QStandardItem("5.0")
            self.tableModel.appendRow([item1, no1])
            # 
            item2 = QtGui.QStandardItem("file#2")
            item2.setCheckable(True)
            no2 = QtGui.QStandardItem("23.0")
            self.tableModel.appendRow([item2, no2])
    
            self.mainLayout = QtWidgets.QVBoxLayout()
            self.setLayout(self.mainLayout)
    
            self.tableView = QtWidgets.QTableView()
            self.tableView.setModel(self.tableModel)
            self.mainLayout.addWidget(self.tableView)
    
            "First Question"
            """How to make table only editable second column, not firts:
               ex. can edit 23.0 or 5.0, but read only file names?
            """        
    
        def itemChanged(self, item):
            if item.checkState() != 0:
                if not item.text() in self.selected:
                    self.selected.append(item.text())
            else:
                if item.text() in self.selected:
                    self.selected.remove(item.text())
    
            print(self.selected)
    
            "Second Question"
            """How to get item checked index and to get the second column value:
               ex. file#2 has 23.0?
            """
    
            self.no.append(second column value) ****?
            print(self.no)
    
    def main():
        app = QtWidgets.QApplication([])
    
        mytable = MyWidget()
        mytable.show()
        app.exec_()
    
    if __name__ == "__main__":
        main()
    

  • 这是两个独立的问题。我认为你应该单独问他们,并相应地修改你的问题

    关于您的第一个问题:如何使列只读?

    为此,您必须定义自己的
    QAbstractTableModel
    class
    来定义一个名为
    flags
    的方法。这些标志将允许您根据需要更改单元格的属性。然后,您必须将新的
    QAbstractTableModel
    传递给
    QTableView
    并将其设置为新模型(它类似于
    QTableView
    的后端)

    您可以随时查看Qt的文档以获得更深入的了解。 ,

    如何使QTable仅可编辑第二列值,而只读第一列值?

    有几种解决方案可以使整列的项成为只读/可编辑

    • 修改标志时,不必按照建议实现自定义模型,因为QStandardItemModel模型允许修改它们:

      # To make them editable:
      item.setEditable(True)
      # or
      # item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
      
      # To make them readonly:
      item.setEditable(False)
      # or
      # item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable)
      
    • 使用代理的编辑器,因为QStandardItemModel模型在默认情况下是可编辑的,因此仅足以确定列0是不可编辑的,因此不应为此生成编辑器:

      class ReadOnlyDelegate(QtWidgets.QStyledItemDelegate):
          def createEditor(self, parent, option, index):
              return
      
    我更喜欢第二个选项,因为默认情况下,它确定第一列是只读的

    如何获取选中项目的索引,以便获取对应于选中项目的第二列的值?

    一般方法是访问父对象,然后访问位于同一行但位于第二列的子对象:

    parent_item = item.parent()
    if parent_item is not None:
        second_item = parent_item.child(item.row(), 1)
    else:
        second_item = item.model().item(item.row(), 1)
    print(second_item.text())
    
    但在您的情况下,可以简化为:

    second_item = self.tableModel.item(item.row(), 1)
    print(second_item.text())
    

    非常感谢您的详细介绍
    parent_item = item.parent()
    if parent_item is not None:
        second_item = parent_item.child(item.row(), 1)
    else:
        second_item = item.model().item(item.row(), 1)
    print(second_item.text())
    
    second_item = self.tableModel.item(item.row(), 1)
    print(second_item.text())