Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从QtableWidget中的隐藏“id”列获取数据_Python_Pyqt5_Qt Designer - Fatal编程技术网

Python 如何从QtableWidget中的隐藏“id”列获取数据

Python 如何从QtableWidget中的隐藏“id”列获取数据,python,pyqt5,qt-designer,Python,Pyqt5,Qt Designer,使用qTableWidget查看我的sqlite数据库条目。 数据库的第一列是隐藏的,因为它是自动分配给条目的ID 现在,我希望用户选择要删除的行,然后能够按delete按钮。 我使用以下方法来实现这一点: class StartScherm(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super(StartScherm, self).__init__() self.setupUi(

使用qTableWidget查看我的sqlite数据库条目。 数据库的第一列是隐藏的,因为它是自动分配给条目的ID

现在,我希望用户选择要删除的行,然后能够按delete按钮。 我使用以下方法来实现这一点:

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中的delete按钮,该函数就会读取ID,这样我就可以从sqlite数据库中删除它。我用这个:

def delete(self):
        index = self.tableSnelleKijk.selectedItems()
        print(index[0].text())
不幸的是,这给了我作为文本的第一个可视列数据,而不是ID为的隐藏列

如何访问隐藏的数据

编辑:将列更改为行 数据库仅隐藏在tableview上,在sqlite中,它只是有一个rowID,我可以使用它访问当前行以进行删除/编辑

数据库代码:

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()

如果数据位于不可见列中,则无法选择该列中的项目。您可以使用函数或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)))

注意,如果您需要向数据库写入数据或编辑其布局,则应该考虑使用一个基本的QTabLeVIEW,否则,您可能会面临一些不一致、错误甚至数据损坏,如果您对实现不十分小心。我认为我最好使用你提到的QSqlTableModel,因为它是一个从集合中添加、编辑和删除项目的程序。干杯