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

问题描述 投票:0回答:1

概述:我有一个显示QTableView的UI。当用户单击表中的一行时,该行中的数据然后填充与该单元格中的信息相对应的几个QLineEdit条目字段-例如,“地址”列将具有一个对应的“地址” QLineEdit该地址数据将填充到的字段。

现有功能:单击一行后,用户可以单击QLineEdit并更改列出的文本-例如,如果列出了错误的地址,则用户可以单击“地址” QLineEdit字段并进行更改换成不同的东西。

所需功能:我希望能够单击“保存”按钮并将数据保存在QLineEdit中,然后反映在QTableView中。

问题:单击“保存”按钮时尝试运行的功能,尝试更新QTableView数据框并刷新视图,但似乎未进行任何更改,并且QTableView数据本身未反映任何更改。

代码示例:

**注-当用户单击QTableView时,将运行一个函数,该函数初始化self.user_selection变量,该变量是QModelIndex对象,在下面引用。QLineEdit字段包含在QGridLayout中,因此在下面使用itemAtPosition函数。self.comp_list是正在填充的QTableView对象

当用户单击“保存”时,将运行以下功能...

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
1个回答
0
投票
为了这个例子,我们假设您的列标题与您的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
    # row from there
    df.loc[self.user_selection.row(), key] = value

然后像通常填充该表一样,将数据帧发送到您的类。

© www.soinside.com 2019 - 2024. All rights reserved.