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

Posted

技术标签:

【中文标题】一旦选择并按下 QButton,如何从 QListWidget 对象中获取项目作为字符串【英文标题】:How to get the item from a QListWidget object as a string once selected and a QButton pushed 【发布时间】:2021-04-24 02:07:06 【问题描述】:

我一直在摇头,徒劳地寻找一种方法让我在 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): 这样我就可以将项目作为字符串访问。有没有办法简单地将变量绑定到我当前单击的任何内容,而无需激活单击事件并创建一个全新的函数?

【问题讨论】:

我不明白。你已经得到了项目的字符串,有什么不适合你的? Model-View 是您所需要的,尝试使用 QListView 代替。下面是如何进行模型视图编程的详细示例:learnpyqt.com/tutorials/modelview-architecture @AlejandroCondori 对于简单的情况,像 QListWidget 这样的更高级别的小部件视图(无论如何都是基于模型视图的)仍然是有效的解决方案,因为 OP 正在从一个数据库并以自定义方式显示而不是存储,它可能比使用 QSql 数据库或 QStandardItemModel 更有意义。 @musicamante 我很抱歉。我应该澄清一下。我想知道是否有一个内置函数来获取字符串而不必使用 self.l_c.itemClicked.connect(self.push) 并且基本上必须创建一个全新的函数 def push(self, item): 只是为了获取项目。我的代码对我来说似乎效率低下?我编辑了我的问题。 @JOHNEDWARDBINAY 创建一个新函数不是问题,如果它提高了代码的质量(包括可读性); OTOH,创建太多只调用一次的函数不好:拥有 4 个负责创建 ui 的独立函数绝对没有任何好处(mainTitlebuttonslist_customer , initUI);也就是说,如果您只需要在单击删除按钮时知道 当前 选定的项目,那么您当然可以避免使用push 函数,并使用currentItem() 获取它。跨度> 【参考方案1】:

正如 cmets 中已经指出的,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

【讨论】:

以上是关于一旦选择并按下 QButton,如何从 QListWidget 对象中获取项目作为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何从选择中定位特定范围的单元格?

Ext js 编辑器网格禁用多行选择

Android按钮选择并按下drawable

如何使用diskpart 命令删除分区

如何找到使用循环创建的 QButton?

如何做到这一点,当在OptionMenu上选择一个Option并按下一个按钮,然后对该特定选项进行操作时