微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 QListWidget 对象中获取项目作为选择后的字符串并按下 QButton

如何解决如何从 QListWidget 对象中获取项目作为选择后的字符串并按下 QButton

我一直在摇头,徒劳地寻找一种方法让我点击 PyQt5 GUI 上的一个项目,然后继续按删除按钮从我的数据库删除该项目。我有点需要获取此项目的字符串(由某人的姓氏后跟一个逗号,然后是名字组成),因为我需要访问我的数据库以通过传入此人的姓名从那里删除此项目在名单上。

请参阅下面的代码

import sqlite3 as sql3
import sys
from PyQt5.QtWidgets import (QMessageBox,QPushButton,QApplication,QWidget,QLineEdit,QDesktopWidget,QLabel,QListWidget,QVBoxLayout,QListWidgetItem)
from PyQt5.QtGui import QIcon,QFont

class deleteUser(QWidget): #QWidget is the base class for all GUI elements in the PyQt5.

    def __init__(self):      
        super().__init__() #initializes the main window
        self.title = "Employee Management System Menu"
        self.x = 60
        self.y = 100
        self.width = 400
        self.height = 400
        self.mainTitle()
        self.buttons()
        self.list_customer()
        self.initUI()
    
    def mainTitle(self):
        self.MainTitle = QLabel("Delete Admins/Users",self)
        self.MainTitle.move(self.x+10,self.y-50)
        self.MainTitle.setFont(QFont('Times',20))
        
    def buttons(self):       
        self.back_ = QPushButton("back",self)
        self.back_.setToolTip("Press to enter App Menu!")
        self.back_.move(self.x+100,self.y+260)
        self.back_.clicked.connect(self.back_clicked)
        
        self.delete_u = QPushButton("delete",self)
        self.delete_u.setToolTip("Press to delete an admin!")
        self.delete_u.move(self.x+100,self.y+230)
        self.delete_u.setStyleSheet('color: red;')
        self.delete_u.clicked.connect(self.deleteClicked)
        
    def push(self,item):       
        self.item = item.text()
        
    def back_clicked(self):
        self.dialog = am.appMenu()
        self.dialog.show()
        self.close()
    
    def list_customer(self):
        self.l_c = QListWidget(self)
        self.l_c.setGeometry(self.x,self.y-15,265,220) 
        db = sql3.connect('appDB.db')
        cr = db.cursor()
        cr.execute("SELECT userId,lastName,firstName FROM users")
        for row in cr:
            self.s = '{}:\t {},{}'.format(row[0],row[1],row[2])
            self.item1 = QListWidgetItem(self.s)
            self.l_c.addItem(self.item1)
        self.l_c.itemClicked.connect(self.push)
        
    def deleteClicked(self):   
        try:
            
            print(self.item)
            print("this button works")
            
        except AttributeError:
            
            QMessageBox.information(self,"ALERT!","You didn't select a user")

    
    def initUI(self):
        self.setwindowTitle(self.title)
        self.resize(self.width,self.height)
        self.setwindowIcon(QIcon("python.ico"))
        self.center()
        self.show()
    
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = deleteUser()
    sys.exit(app.exec_())

我本质上想要做的是不必使用 self.l_c.itemClicked.connect(self.push) 来创建一个全新的函数 def push(self,item): 这样我就可以以字符串的形式访问该项目。有没有一种方法可以简单地将变量绑定到我当前点击的任何内容,而不必激活点击事件并创建一个全新的功能

解决方法

正如评论中已经指出的,currentItem() 返回当前选择的列表项。因此,您可以跳过单击事件 + 附加功能,只需将删除功能替换为:

def deleteClicked(self):   
    try:
        print(self.l_c.currentItem().text())
        print("this button works") 
    except AttributeError:
        
        QMessageBox.information(self,"ALERT!","You didn't select a user")

您可以进一步使用 currentItemChanged event 直接对用户与列表的交互做出反应,例如参见this stack answer

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。