如何从 QLineEdit 获取文本以更新 QTableView 中的单元格
How to get text from a QLineEdit to update cells in a QTableView
概述:我有一个显示 QTableView
的 UI。当用户单击 table 中的一行时,该行的数据将填充几个 QLineEdit
条目字段,对应于该单元格中的信息 - 例如 'ADDRESS' 列将具有相应的 'ADDRESS' QLineEdit
字段,该地址数据将填充到该字段中。
现有功能:单击一行后,用户可以单击 QLineEdit
并更改列出的文本 - 例如,如果列出了错误的地址,用户可以单击 'ADDRESS' QLineEdit
字段并将其更改为不同的内容。
所需功能:我希望能够单击 'SAVE' 按钮并将数据放入 QLineEdit
,然后反映在 QTableView
。
问题:单击 'SAVE' 按钮时运行的函数尝试更新 QTableView
数据框并刷新视图,但似乎没有进行任何更改并且 QTableView
数据本身,不反映任何变化。
代码示例:
**注意 - 当用户单击 QTableView
时,将运行一个函数来初始化 self.user_selection
变量,这是一个 QModelIndex
对象,在下面引用。
QLineEdit
字段包含在 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())
我的 class 的简化版本填充 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
甚至不用理会 setData
函数,根据您那里的情况,不需要它。由于您已经从 items
变量中的单元格中获取所有数据,因此只需使用它来更新您首先从中填充 QTableView
的来源。由于您知道该方法有效,它会获取您的更新数据,您可以像往常一样刷新 table。
为了这个例子,我们假设您的列 headers 与您的 widget().objectName() 列相同,对于您 [=13= 中的每个 QWidgetItem ] 多变的。您显然可以将其更改为您想要的任何内容。
您可以创建一个字典,将您的列名作为键,然后将 QLineEdit
文本作为您的值。
new_input = {metric.widget().objectName: metric.widget().text() for metric in items}
然后将该数据发送回您的数据框。
for key, value in zip(new_input.keys(), new_input.values()):
# You said the self.user_selection was a QModelIndex, so you can get your selected
# row from there
df.loc[self.user_selection.row(), key] = value
然后将该数据帧发送到您的 class 就像您通常填充 table.
一样
概述:我有一个显示 QTableView
的 UI。当用户单击 table 中的一行时,该行的数据将填充几个 QLineEdit
条目字段,对应于该单元格中的信息 - 例如 'ADDRESS' 列将具有相应的 'ADDRESS' QLineEdit
字段,该地址数据将填充到该字段中。
现有功能:单击一行后,用户可以单击 QLineEdit
并更改列出的文本 - 例如,如果列出了错误的地址,用户可以单击 'ADDRESS' QLineEdit
字段并将其更改为不同的内容。
所需功能:我希望能够单击 'SAVE' 按钮并将数据放入 QLineEdit
,然后反映在 QTableView
。
问题:单击 'SAVE' 按钮时运行的函数尝试更新 QTableView
数据框并刷新视图,但似乎没有进行任何更改并且 QTableView
数据本身,不反映任何变化。
代码示例:
**注意 - 当用户单击 QTableView
时,将运行一个函数来初始化 self.user_selection
变量,这是一个 QModelIndex
对象,在下面引用。
QLineEdit
字段包含在 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())
我的 class 的简化版本填充 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
甚至不用理会 setData
函数,根据您那里的情况,不需要它。由于您已经从 items
变量中的单元格中获取所有数据,因此只需使用它来更新您首先从中填充 QTableView
的来源。由于您知道该方法有效,它会获取您的更新数据,您可以像往常一样刷新 table。
为了这个例子,我们假设您的列 headers 与您的 widget().objectName() 列相同,对于您 [=13= 中的每个 QWidgetItem ] 多变的。您显然可以将其更改为您想要的任何内容。
您可以创建一个字典,将您的列名作为键,然后将 QLineEdit
文本作为您的值。
new_input = {metric.widget().objectName: metric.widget().text() for metric in items}
然后将该数据发送回您的数据框。
for key, value in zip(new_input.keys(), new_input.values()):
# You said the self.user_selection was a QModelIndex, so you can get your selected
# row from there
df.loc[self.user_selection.row(), key] = value
然后将该数据帧发送到您的 class 就像您通常填充 table.
一样