Pyqt5自定义下拉框点击事件

Author Avatar
NENEIIII Apr 07, 2021
  • Read this article on other devices

实现功能

在信息管理模块中,我需要增加删除用户的功能,每次点击下拉框时可以实时扫描当前用户信息(每个用户是单独放在文件夹内,相当于扫描一个大文件夹下的文件夹名),然后选择对应的id进行删除。

image-20210910094258902

comboBox

初步想法是为cBox添加点击事件,每次点击都调用一个函数去扫描指定文件夹下的文件名。

QComboBox类中的常用方法如表

方法 描述
addItem() 添加一个下拉选项
addItems() 从列表中添加下拉选项
Clear() 删除下拉选项集合中的所有选项
count() 返回下拉选项集合中的数目
currentText() 返回选中选项的文本
itemText(i) 获取索引为i的item的选项文本
currentIndex() 返回选中项的索引
setItemText(int index,text) 改变序列号为index的文本

QComboBox类中的常用信号

信号 含义
Activated 当用户选中一个下拉选项时发射该信号
currentIndexChanged 当下拉选项的索引发生改变时发射该信号
highlighted 当选中一个已经选中的下拉选项时,发射该信号

虽然cbox没有像button那样直接有一个点击事件的函数,但是我们可以想到通过自定义槽函数来实现类似点击的触发效果。

具体操作如下:

  1. 原有的combobox类不含有点击事件,因此我们需要重写一个mycombobox(添加clicked事件)

    class MyComboBox(QComboBox): # 继承原有类
        clicked = pyqtSignal()   #创建一个信号
        def showPopup(self):     #重写showPopup函数
            self.clicked.emit()  #发送信号
            super(MyComboBox, self).showPopup()# 调用父类的showPopup()
    
  2. 使用该类创建一个cboxself.cbox = MyComboBox(self.layoutWidget)

  3. 绑定clicked事件self.cbox.clicked.connect(self.scan_DirList)

  4. 添加点击事件scan_Dirlist

        def scan_DirList(self):
            # 获取用户名
            dirs = os.listdir(self.saveDir)
            AllItems = [self.cbox.itemText(i) for i in range(self.cbox.count())]
            if dirs ==[] :
                QMessageBox.warning(self," ","当前没有用户数据")
                self.cbox.clear()
            else :
                # 注意cbox选项不能有重复的因此需要判断
                for i in dirs :
                    if i not in AllItems:
                        self.cbox.addItem(i)
    

实现效果

image-20210910100446230