sibling 或 siblingAtRow() 函数如何从 QTableWidget 中的隐藏列中检索值?

How does sibling or siblingAtRow() function works to retrieve the value from hidden Column in QTableWidget?

我有一个数据库,数据从该数据库进入 QTableWidget。数据库中的 table 有以下列,

QTableWidget 有以下列(我添加的)

隐藏,我的意思是说我已经使用 folliwng 命令隐藏了这一列,

self.ui.table.setColumnHidden(0, True); 

这就是我填充 QTable 小部件和创建删除函数的方式,

    def get_data(self):
        mycursor = self.DB.cursor()
        Subquery = "select id, name, location "
        Subquery += " from tbl_person"
        mycursor.execute(Subquery)
        numcols = len(mycursor.fetchall()[0])
        mycursor.execute(Subquery)
        numrows = len(mycursor.fetchall())
        self.ui.table.setRowCount(numrows)
        self.ui.table.setColumnCount(numcols+2)
        mycursor.execute(Subquery)
        tablerow = 0
        for row in mycursor.fetchall():
            layout = QHBoxLayout()
            layout.setContentsMargins(0, 0, 0, 0)
            layout.setSpacing(0)
            delete_button = QPushButton("Delete Data")
            delete_button.clicked.connect(self.executeDeleteFunction)
            # delete_button.setStyleSheet(delete_push_button) -> Only for styling
            self.ui.table.setItem(tablerow, 0, PySide2.QtWidgets.QTableWidgetItem(str(row[0])))
            self.ui.table.setItem(tablerow, 1, PySide2.QtWidgets.QTableWidgetItem(str(tablerow+1)))
            self.ui.table.setItem(tablerow, 2, PySide2.QtWidgets.QTableWidgetItem(str(row[1])))
            self.ui.table.setItem(tablerow, 3, PySide2.QtWidgets.QTableWidgetItem(str(row[2])))
            self.ui.table.setCellWidget(tablerow, 4, delete_button)
            tablerow += 1
        self.ui.table.setColumnHidden(0, True)
        #self.ui.registered_table.horizontalHeader().setSectionResizeMode(PySide2.QtWidgets.QHeaderView.Stretch)
        self.ui.table.resizeColumnsToContents()

def executeDeleteFunction(self):
    self.person_id = self.ui.table.selectionModel().selectedIndexes()[0]
    self.person_id = self.person_id.row()
    mycursor = self.DB.cursor()
    sql = "delete from tbl_person where id = %s"
    val = (id, )
    mycursor.execute(sql, val)
    print("Deletion Successful")

关于删除函数,这段代码所做的基本上是从 QTableWidget 中获取 **Sr # ** 列的值并根据该值删除数据,即它让我来自 visible first column 而不是 actual first column 的值。但是,我想要来自 QTableWidget 隐藏的“ID”列的数据

我试图查找 how to get the value from the first hidden column on the QTableWidget 并以这个 link 结束:

这显然解决了我的问题,但我似乎无法使其适用于我的代码。我不想检索多行的值,而只想检索一行的值,所以我该怎么做(因为我只删除一行。但是在提到的问题中,我相信它是从多行获取数据的原因对于每个循环)?

此外,我试图找到有关 sibling 函数功能的帮助(在上述问题的答案中提供)但是我找不到关于此函数的任何好的资源(即如何使用它, 或者一些实际的例子等等)

我用 Sibling 函数尝试了以下方法来获取所选行的第一个隐藏列的值,但它没有用,

self.value = self.table.selectedItems()[0]
self.value = sibling(self.value.row(), 0)

给定的代码存在一些概念性问题。

首先应该优先使用QtSql模块,而不是人为创建模型。对于基本的tables,QSqlTableModel is fine enough, while for custom queries, QSqlQueryModel是一个不错的选择。

现在的问题是基于 UI 的 selection 总是 基于可见项:如果你 select 中的一行具有隐藏列的视图,您将不会获得属于这些列的隐藏索引。

为了获取 table 小部件上隐藏列的 indexes(如 QModelIndex),唯一的方法与table view:您需要访问 model 并获取行的索引,或者获取实际的模型索引,然后获取同级(概念上相同,与底层函数相同):

    item = self.table.selectedItems()[0]
    index = self.table.indexForItem(index)
    firstRowIndex = index.sibling(index.row(), 0)
    sqlIndex = firstRowIndex.data() # might be a string

注意你也可以使用siblingAtColumn():

    firstRowIndex = index.siblingAtColumn(0)

那是因为当您创建 QTableWidget 项目时,您实际上是在创建一个 new 模型,而 that 模型的行没有' t 反映源模型中该索引的实际“行”;第二行中的项目将为 row() return 1,即使它们的实际行不同,那是因为该项目已添加为 second 添加到 table 小部件,因为它是查询中的第二个 项目

因此,解决方案是获取第一列索引同级的增量行值,或者使用其中一个预定义的 Sql 模型。

对于简单的模型,后一种解决方案就足够了,但如果您需要更复杂的模型,第一种肯定更准确可靠。