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
,我有两个问题
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())