如何从QLineEdit中获取文本以更新QTableView中的单元格

0 人关注

概述。我有一个用户界面,显示一个 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
    
python
pyqt5
qtableview
spareTimeCoder
spareTimeCoder
发布于 2020-01-25
1 个回答
NL23codes
NL23codes
发布于 2020-01-25
已采纳
0 人赞同

甚至不必理会 setData 函数,根据你的情况,没有必要使用它。既然你已经从你的 items 变量中的单元格获得了所有的数据,只要用它来更新你首先填充 QTableView 的源。既然你知道这个方法是有效的,它就会接受你更新的数据,你就可以像平时一样刷新你的表格。

为了这个例子,让我们假设你的列标题与你的widget().objectName()在你的 items 变量中的每个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