sibling 或 siblingAtRow() 函数如何从 QTableWidget 中的隐藏列中检索值?
How does sibling or siblingAtRow() function works to retrieve the value from hidden Column in QTableWidget?
我有一个数据库,数据从该数据库进入 QTableWidget。数据库中的 table 有以下列,
- ID (主键,自增值)
- 姓名
- 位置
QTableWidget 有以下列(我添加的)
- ID (此列,我已隐藏。它包含数据库中“ID”列的值 Table)
- Sr#(表示table的行号)
- 姓名(包含数据库中的“姓名”table)
- 位置(包含“来自数据库的位置table)
- 操作(包含该行的删除按钮)
隐藏,我的意思是说我已经使用 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 模型。
对于简单的模型,后一种解决方案就足够了,但如果您需要更复杂的模型,第一种肯定更准确可靠。
我有一个数据库,数据从该数据库进入 QTableWidget。数据库中的 table 有以下列,
- ID (主键,自增值)
- 姓名
- 位置
QTableWidget 有以下列(我添加的)
- ID (此列,我已隐藏。它包含数据库中“ID”列的值 Table)
- Sr#(表示table的行号)
- 姓名(包含数据库中的“姓名”table)
- 位置(包含“来自数据库的位置table)
- 操作(包含该行的删除按钮)
隐藏,我的意思是说我已经使用 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 模型。
对于简单的模型,后一种解决方案就足够了,但如果您需要更复杂的模型,第一种肯定更准确可靠。