将方法连接到自定义 QListView 小部件 - PyQt5 和 postgreSQL



我有一个简单的Qt应用程序,它使用自定义小部件在QListView中添加和列出从postgresql db检索到的记录。我在设置按钮(每个列表项实例的左下角)时遇到了一些困难,这将有效地使用(实例的)记录主键从db中删除记录

from PyQt5 import QtCore, QtWidgets
import psycopg2
import sys
import dbAPP_GUI
import listItem_GUI

class dbAPP(QtWidgets.QMainWindow, dbAPP_GUI.Ui_MainWindow):
    def __init__(self, parent=None):
        super(dbAPP, self).__init__(parent)
        self.setupUi(self)
        self.conn = psycopg2.connect(database="Name", user="anthony@primeinstr.co.za"
                                     , password="14581458", host="127.0.0.1")
        self.ListItemLine = listItem()
        # ==============
        # CONNECTIONS
        # ==============
        self.btn_save.clicked.connect(self.writeData)
        self.tabWidget.currentChanged.connect(self.fetchData)
        self.btn_go.clicked.connect(self.searchData)

    # =============
    # METHODS
    # =============
    def writeData(self):
        name = self.name_lineEdit.text()
        surn = self.surname_lineEdit.text()
        age = self.age_lineEdit.text()
        address = self.address_lineEdit.text()
        if len(name) > 0:
            c = self.conn.cursor()
            c.execute(" INSERT INTO info (name, surname, age, address)"
                      "VALUES (%s, %s, %s, %s)", (name, surn, age, address))
            self.conn.commit()
            QtWidgets.QMessageBox.information(self, "Notice", "Information was successfully written to database")
            self.name_lineEdit.clear()
            self.surname_lineEdit.clear()
            self.age_lineEdit.clear()
            self.address_lineEdit.clear()
        else:
            QtWidgets.QMessageBox.warning(self, "Warning", "The name field is empty, please enter a value")

    def fetchData(self):
        self.listWidget.clear()
        lineNo = 0
        c = self.conn.cursor()
        c.execute("SELECT * FROM info;")
        listing = c.fetchall()
        for i in listing:
            name = (str(i[:1]).replace("(", "").replace(")", "").replace("'", "").replace(",", ""))
            surn = (str(i[1:2]).replace("(", "").replace(")", "").replace("'", "").replace(",", ""))
            age = (str(i[2:3]).replace("(", "").replace(")", "").replace("'", "").replace(",", ""))
            address = (str(i[3:4]).replace("(", "").replace(")", "").replace("'", "").replace(",", ""))
            ID = (str(i[4:5]).replace("(", "").replace(")", "").replace("'", "").replace(",", ""))
            nameSurn = name + " " + surn
            lineNo += 1
            label = listItem()
            label.num_label.setText(str(lineNo))
            label.nameSurn_label.setText(nameSurn)
            label.age_label.setText(age)
            label.address_label.setText(address)
            label.id_label.setText(ID)
            x = QtWidgets.QListWidgetItem()
            x.setSizeHint(QtCore.QSize(280, 60))
            self.listWidget.addItem(x)
            self.listWidget.setItemWidget(x, label)
            label.show()

    def searchData(self):
        self.listWidget_2.clear()
        lineNo = 0
        c = self.conn.cursor()
        c.execute("SELECT * FROM info;")
        results = c.fetchall()
        for i in results:
            name = (str(i[:1]).replace("(", "").replace(")", "").replace("'", "").replace(",", ""))
            surn = (str(i[1:2]).replace("(", "").replace(")", "").replace("'", "").replace(",", ""))
            age = (str(i[2:3]).replace("(", "").replace(")", "").replace("'", "").replace(",", ""))
            address = (str(i[3:4]).replace("(", "").replace(")", "").replace("'", "").replace(",", ""))
            nameSurn = name + " " + surn
            if str(self.search_lineEdit.text()).lower() == name.lower()
                    or str(self.search_lineEdit.text()).lower() == surn.lower()
                    or str(self.search_lineEdit.text()).lower() == address.lower():
                lineNo += 1
                label = listItem()
                label.num_label.setText(str(lineNo))
                label.nameSurn_label.setText(nameSurn)
                label.age_label.setText(age)
                label.address_label.setText(address)
                x = QtWidgets.QListWidgetItem()
                x.setSizeHint(QtCore.QSize(280, 60))
                self.listWidget_2.addItem(x)
                self.listWidget_2.setItemWidget(x, label)
                label.show()
# ======================================================================================================================
class listItem(QtWidgets.QWidget, listItem_GUI.Ui_lineItem):
    def __init__(self, parent=None):
        super(listItem, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setupUi(self)
        self.btn_del.clicked.connect(self.delData)

    def delData(self):
        ID = self.id_label.text()
        print(ID)
        c = psycopg2._ext.connection.cursor()
        c.execute("DELETE FROM info WHERE id=(%s)", (ID))
# ======================================================================================================================
app = QtWidgets.QApplication(sys.argv)
app.setStyle("fusion")
main = dbAPP()
main.show()
List = listItem()
List.hide()
sys.exit(app.exec_())

目前它失败了,因为方法"DelData"中的光标对象需要一个参数。然而,如果这是正确的做法,我可以诚实地说。如果有人有更好的建议,那也可以。我只是想找到我的脚与PyQt, postgreSQL和Python:)

第二个要执行的参数是序列或映射。但是你实际上是在传递一个字符串,因为元组主要是由逗号定义的,而不是括号。

所以你应该这样做:

c.execute("DELETE FROM info WHERE id=%s", (ID,)) # tuple

或:

c.execute("DELETE FROM info WHERE id=%s", [ID]) # list

或:

c.execute("DELETE FROM info WHERE id=%(ID)s", {'ID': ID}) # dict

最新更新