Pyqt5中实现鼠标点击QComboBox刷新下拉菜单项

最近在写一个继电器自动控制上下电的小工具,其中需要用一个ComboBox来显示目前电脑上接入的所有串口信息。由于电脑上的串口设备是随时可以插拔的,因此ComboBox里的下拉列表中的串口信息必须是最新的串口信息。因此,我的想法就是每当用鼠标点击ComboBox时,自动去读取目前的所有串口设备信息,显示在下拉列表中。下图是我的小工具界面图:

Pyqt5中实现鼠标点击QComboBox刷新下拉菜单项_第1张图片

这里的实现主要参考了http://blog.csdn.net/pzx_hkq/article/details/78794829这篇博客里的。但是按此实现,发现鼠标点击过后下拉列表根本就不弹出来了,后来思考了一下用了其他方式实现。下面我就整理一下我最终的实现:

  1. 使用Qt Designer设置好界面,并转化成py文件。这里使用到的工具以及配置可参考这篇博客:http://blog.csdn.net/a359680405/article/details/45074761

  2. 新建自己的ComboBox类,重写QComboBox的showPopup()函数(显示下拉列表的函数)。这里在showPopup()函数中,先获取此时电脑上所接入的串口设备,加入到下拉列表中,然后再使用父类的showPopup()函数弹出列表项。即在弹出之前加入了获取串口设备操作。代码如下:

import serial
import serial.tools.list_ports
import logging
from PyQt5.QtWidgets import QComboBox
from PyQt5.QtCore import pyqtSignal


class CustomComboBox(QComboBox):
    popupAboutToBeShown = pyqtSignal()

    def __init__(self, parent = None):
        super(CustomComboBox,self).__init__(parent)

    # 重写showPopup函数
    def showPopup(self):
        # 先清空原有的选项
        self.clear()
        self.insertItem(0, "请选择继电器串口号")
        index = 1
        # 获取接入的所有串口信息,插入combobox的选项中
        portlist = self.get_port_list(self)
        if portlist is not None:
            for i in portlist:
                self.insertItem(index, i)
                index += 1
        QComboBox.showPopup(self)   # 弹出选项框

    @staticmethod
    # 获取接入的所有串口号
    def get_port_list(self):
        try:
            port_list = list(serial.tools.list_ports.comports())
            for port in port_list:
                yield str(port)
        except Exception as e:
            logging.error("获取接入的所有串口设备出错!\n错误信息:"+str(e))

3 . 此时再把界面的py文件中的原生QComboBox替换成自己重写的ComboBox

self.comboBox = CustomComboBox(self.centralwidget)

你可能感兴趣的:(Pyqt5中实现鼠标点击QComboBox刷新下拉菜单项)