概述。我有一个用户界面,显示一个
QTableView
。当用户点击表格中的某一行时,该行的数据就会弹出几个
QLineEdit
的输入字段,与该单元格中的信息相对应--例如,'ADDRESS'列会有一个相应的'ADDRESS'
QLineEdit
字段,该地址数据会弹出来。
现有的功能。在点击某一行后,用户可以点击
QLineEdit
并改变所列出的文本--例如,如果列出了错误的地址,用户可以点击'ADDRESS'
QLineEdit
字段并将其改为其他内容。
希望的功能。我希望能够点击'SAVE'按钮,让
QLineEdit
中的数据,然后反映在
QTableView
中。
问题:当点击 "SAVE "按钮时,运行的函数试图更新
QTableView
数据框并刷新视图,但似乎没有任何变化,而且
QTableView
数据本身也没有反映任何变化。
代码示例。
**注意--当用户点击
QTableView
时,一个函数运行,它初始化了
self.user_selection
变量,该变量是一个
QModelIndex
对象,并在下面引用。
替换代码1】字段包含在
QGridLayout
中,因此下面使用了
itemAtPosition
函数。
self.comp_list
是正在被填充的QTableView对象
当用户点击'SAVE'时,运行以下功能...
def update_selected_comp_entry(self):
# This will get all of the values for each column, for the row selected - this returns a
# QWidgetItem, which is why widget().text() must be used to retrieve the cell's data
items = [self.comp_details_layout.itemAtPosition(i, 1) for i in range(self.comp_details_layout.count()) if isinstance(comp_details_layout.itemAtPosition(i, 1), PyQt5.QtWidgets.QWidgetItem)]
for i, each in enumerate(items):
self.comp_list.model().setData(self.user_selection, each.widget().text())
我的一个简化版本的类,填充了QTableView
。
class DataFrameModel(PyQt5.QtCore.QAbstractTableModel):
def __init__(self, df=pandas.DataFrame(), parent=None):
super(DataFrameModel, self).__init__(parent)
self._dataframe = df.replace(numpy.nan, '', regex=True)
def setDataFrame(self, dataframe):
self.beginResetModel()
self._dataframe = dataframe.copy()
self.endResetModel()
# @PyQt5.QtCore.pyqtSlot() - I've tried using this decorator and it didn't do anything
# This function is my attempt at grabbing the user's input and updating
# the QTableView displayed data
def setData(self, index, value, role=PyQt5.QtCore.Qt.EditRole):
if index.isValid():
row = index.row()
col = index.column()
# I've tried with and without the line below
self.layoutAboutToBeChanged.emit()
# I've tried using set_value() as well as iloc and neither worked
self._dataframe.loc[row, col] = value
# I';ve tried with and without this line, neither worked
self.setDataFrame(self._dataframe)
# I've also tried the dataChanged signal and that didn't work either
self.layoutChanged.emit()
return True
return False