如何从QtableWidget中隐藏的'id'列获取数据
How to get data from hidden 'id' column in QtableWidget
使用 qTableWidget 查看我的 sqlite 数据库条目。
数据库的第一列是隐藏的,因为它是自动分配给条目的 ID。
现在我希望用户 select 他想要删除的行然后能够按下删除按钮。
我正在使用以下方法来做到这一点:
class StartScherm(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(StartScherm, self).__init__()
self.setupUi(self)
self.database_laden()
# -- Button presses with .connect -- #
self.tableSnelleKijk.doubleClicked.connect(self.weergave_scherm)
self.tableSnelleKijk.setSelectionBehavior(
QtWidgets.QTableView.SelectRows)
self.tableSnelleKijk.setColumnHidden(0, True)
现在我正在尝试创建一个函数,一旦用户单击 GUI 中的删除按钮,该函数就会读取 ID,以便我可以将其从 sqlite 数据库中删除。我用这个:
def delete(self):
index = self.tableSnelleKijk.selectedItems()
print(index[0].text())
不幸的是,这给了我第一个可见的列数据作为文本而不是带有 ID 的隐藏列。
如何访问隐藏数据?
编辑:将列更改为行
数据库仅隐藏在表视图中,在 sqlite 中它只是有一个 rowID,我可以使用它来访问当前行 delete/edit.
数据库代码:
c.execute("""CREATE TABLE Medailles (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
orde text,
periode text,
locatie text,
beschrijving text
)""")
该列在 QtableView 中通过 .setColumnHidden 隐藏。
当用户决定输入新条目时,数据库会被填充,这是处理此问题的函数:
def add(self):
orde = self.orde_comboBox.currentText()
periode = self.periode_input.text()
locatie = self.locatie_input.text()
beschrijving = self.beschrijving_input.toPlainText()
medaille = Medaille(orde, periode, locatie, beschrijving)
with conn:
c.execute("INSERT INTO Medailles (orde, periode, locatie, beschrijving) VALUES (:orde, :periode, :locatie, :beschrijving)", {
'orde': medaille.orde, 'periode': medaille.periode, 'locatie': medaille.locatie, 'beschrijving': medaille.beschrijving})
self.close()
如果数据在不可见列中,则无法选择该列中的项目。您可以使用 sibling(row, column)
function (or siblingAtColumn(column)
for Qt>=5.11:
访问这些索引(及其数据)
def delete(self):
rows = set()
for index in self.tableSnelleKijk.selectedItems():
id = index.sibling(index.row(), 0).text()
rows.add(id)
print('IDs to delete: {}'.format(sorted(rows)))
请注意,如果您需要将数据写入数据库或编辑其布局,您应该考虑使用带有 QtSql.QSqlTableModel 的基本 QTableView,否则您可能会遇到一些不一致、错误甚至数据损坏你对你的实施并不十分小心。
获取 QTableWidget (PyQt5) 中隐藏列的值:
row = self.tblWidget.currentRow()
col = position of hidden column - usually 0
ID = self.tblWidget.item(row,col).text()
使用 qTableWidget 查看我的 sqlite 数据库条目。 数据库的第一列是隐藏的,因为它是自动分配给条目的 ID。
现在我希望用户 select 他想要删除的行然后能够按下删除按钮。 我正在使用以下方法来做到这一点:
class StartScherm(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(StartScherm, self).__init__()
self.setupUi(self)
self.database_laden()
# -- Button presses with .connect -- #
self.tableSnelleKijk.doubleClicked.connect(self.weergave_scherm)
self.tableSnelleKijk.setSelectionBehavior(
QtWidgets.QTableView.SelectRows)
self.tableSnelleKijk.setColumnHidden(0, True)
现在我正在尝试创建一个函数,一旦用户单击 GUI 中的删除按钮,该函数就会读取 ID,以便我可以将其从 sqlite 数据库中删除。我用这个:
def delete(self):
index = self.tableSnelleKijk.selectedItems()
print(index[0].text())
不幸的是,这给了我第一个可见的列数据作为文本而不是带有 ID 的隐藏列。
如何访问隐藏数据?
编辑:将列更改为行 数据库仅隐藏在表视图中,在 sqlite 中它只是有一个 rowID,我可以使用它来访问当前行 delete/edit.
数据库代码:
c.execute("""CREATE TABLE Medailles (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
orde text,
periode text,
locatie text,
beschrijving text
)""")
该列在 QtableView 中通过 .setColumnHidden 隐藏。 当用户决定输入新条目时,数据库会被填充,这是处理此问题的函数:
def add(self):
orde = self.orde_comboBox.currentText()
periode = self.periode_input.text()
locatie = self.locatie_input.text()
beschrijving = self.beschrijving_input.toPlainText()
medaille = Medaille(orde, periode, locatie, beschrijving)
with conn:
c.execute("INSERT INTO Medailles (orde, periode, locatie, beschrijving) VALUES (:orde, :periode, :locatie, :beschrijving)", {
'orde': medaille.orde, 'periode': medaille.periode, 'locatie': medaille.locatie, 'beschrijving': medaille.beschrijving})
self.close()
如果数据在不可见列中,则无法选择该列中的项目。您可以使用 sibling(row, column)
function (or siblingAtColumn(column)
for Qt>=5.11:
def delete(self):
rows = set()
for index in self.tableSnelleKijk.selectedItems():
id = index.sibling(index.row(), 0).text()
rows.add(id)
print('IDs to delete: {}'.format(sorted(rows)))
请注意,如果您需要将数据写入数据库或编辑其布局,您应该考虑使用带有 QtSql.QSqlTableModel 的基本 QTableView,否则您可能会遇到一些不一致、错误甚至数据损坏你对你的实施并不十分小心。
获取 QTableWidget (PyQt5) 中隐藏列的值:
row = self.tblWidget.currentRow()
col = position of hidden column - usually 0
ID = self.tblWidget.item(row,col).text()