【问题标题】:Updating and deleting the MySQLite database through dynamic button on QTableWidget通过 QTableWidget 中的动态按钮更新和删除 SQLite 数据库
【发布时间】:2021-03-05 11:31:49
【问题描述】:

我创建了一个相当简单的应用程序,它从 LineEdit 中获取三个输入参数,并通过放置在它旁边的按钮将其显示在 QTablewidget 中。在 QTableWidget 中,动态 update buttonremoves button 在填充行值时创建。每当更改 QTableWidget 的单元格并单击更新按钮时,它都会更新数据库中的值。删除按钮有助于从数据库中删除特定的行条目。我可以从 QTableWidget 的值中删除,但不能从数据库中删除。

ui,_ = loadUiType('drake.ui')
from db_new import DatabaseNew
db_new = DatabaseNew('database-punk-2')
class LoginNew(QMainWindow, ui):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.show_database()
        self.pushButton.clicked.connect(self.addToTableWidget)
    

    def addToTableWidget(self):
        self.row_data = []
        self.val1 =  self.lineEdit.text()
        self.row_data.append(self.val1)
        self.val2 = self.lineEdit_2.text()
        self.row_data.append(self.val2)
        self.val3 =  self.lineEdit_3.text()
        self.row_data.append(self.val3)


        row = self.tableWidget.rowCount()
        self.tableWidget.setRowCount(row+1)
        col = 0
        for item in self.row_data:
            cell = QTableWidgetItem(str(item))
            self.tableWidget.setItem(row, col, cell)
            col += 1
        
        db_new.insert(self.val1,self.val2, self.val3)
       
        for index in range(self.tableWidget.rowCount()):
            self.btx =  QPushButton(self.tableWidget)
            self.btn =  QPushButton(self.tableWidget)
            self.btx.setText("Update")
            self.btn.setIcon(QIcon(QPixmap("delete.png")))
            self.btn.setIconSize(QSize(35,35))
            self.btx.clicked.connect(self.update_pos)
            self.btn.clicked.connect(self.delete_pos)
            self.tableWidget.setCellWidget(index,3, self.btx)
            self.tableWidget.setCellWidget(index,4,self.btn)
        
    
    def show_database(self):
        res = db_new.fetch_data()
        self.tableWidget.setRowCount(0)
        for row_number, row_data in enumerate(res):
            self.tableWidget.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.tableWidget.setItem(row_number, column_number,  QTableWidgetItem(str(data)))

    def update_pos(self):
        self.button =self.focusWidget()
        self.index = self.tableWidget.indexAt(self.button.pos())
        self.button.clicked.connect(self.btn_trigger)
    
    def btn_trigger(self):
        QMessageBox.information(self, "Update Data", f' Value  is {self.index.row()} {self.index.column()}')
        # db_new.update(self.index.row()-1,self.val1,self.val2,self.val3)
        # Unable to find appropiate method for updating the values from the database.



        
    
    def delete_pos(self):
        rows = set()
        print("First row Value ")
        print(rows)
        for indexes in self.tableWidget.selectedIndexes():
            rows.add(indexes.row())
           

        for row in sorted(rows, reverse=True):
            self.tableWidget.removeRow(row)
        # Unable to find the appropiate logic for removing from database


def main():
    app =  QApplication(sys.argv)
    win = LoginNew()
    win.show()
    app.exec_()


if __name__ =='__main__':
    main()

数据库文件

界面文件图片

我无法使用行删除按钮更新数据库或删除特定行,我做不到。

【问题讨论】:

  • 请提供minimal reproducible example,请不要码图片
  • 究竟是什么发生了意外?是否调用了正确的函数?从我所看到的,您只在初始化期间调用 show_database() 一次,并且再也不会调用,因此没有更新......?
  • @ChristianKarcher 我无法更新数据库,因为我没有找到如何同步 QTableWidget 的 rowid 和数据库的 id(主键)。

标签: python-3.x pyqt pyqt5 mysql-python


【解决方案1】:

据我所知,我理解以下内容:

使用show_database() -> fetch_data(),您只能从数据库中获取字段 description_one、description_two 和 status。

这里缺少的信息是“ID”。您的删除和更新功能需要此字段。您尝试使用 self.index.row()-1 来模拟这一点,但这肯定会失败,因为 ID 通常是自动递增的,因此不再一定是 1-2-3-fashion。

所以我建议在表中添加一个 ID 列,并使用 fetch_data 获取该字段。一旦你有了它,你应该能够以直接的方式使用你的删除和更新函数,直接实现获取的 ID。

如果您想整理界面,可以hide this column,因为它不包含界面潜在用户的任何可行信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多