pyqt5 可编辑并且添加item的qcombobox

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QEvent

class MyClass(QWidget):
def init(self):
super(MyClass, self).init()
self.initUI()

def initUI(self):
    self.setWindowTitle("可编辑并且添加项目的下拉框")
    self.setGeometry(300,100,600,150)

    myframe = QFrame(self)
    myframe.move(50,50)
    lbl1=QLabel("你的姓名:",myframe)
    lbl1.move(0,3)
    self.combo=QComboBox(myframe)
    self.combo.setGeometry(60,0,110,20)#move(60,0)
    self.combo.setEditable(True)
    self.combo.lineEdit().setPlaceholderText("最长六个字符")
    self.combo.lineEdit().setMaxLength(6)
    self.combo.installEventFilter(self)

    self.pushbutton = QPushButton(myframe)
    self.pushbutton.move(220, 0)
    self.show()

def eventFilter(self, obj, event):

    AllItems = [self.combo.itemText(i) for i in range(self.combo.count())]
    if obj == self.combo:
        if event.type() == QEvent.FocusOut:
            if self.combo.lineEdit().text() not in AllItems and self.combo.lineEdit().text() != '':
                self.combo.addItem(self.combo.lineEdit().text());
    return QWidget.eventFilter(self,obj,event)

if name==“main”:
app=QApplication(sys.argv)
mc=MyClass()
app.exec_()

pyqt5 可编辑并且添加item的qcombobox_第1张图片
pyqt5 可编辑并且添加item的qcombobox_第2张图片
这里关键点有两个:
(1)首先QComboBox有一个属性editable,设置为true后发现QComboBox中的当前项变成了像lineEdit一样的可编辑状态,查阅API文档得知,QComboBox本身就提供了lineEdit方法来获取用来编辑item项的lineEdit,前提是设置editable属性为true。

(2)知道了如何编辑item项,那么编辑之后如何将编辑内容添加到QComboBox的item项中呢?
实现逻辑很简单,使用addItem添加即可。但是何时触发该逻辑呢?即判断用户输入完毕的条件是什么?自然而然想到,应该在QComboBox失去鼠标焦点的时候进行触发。但是查阅文档并没有发现提供失去鼠标焦点的信号,只有一个相似的editTextChanged信号,该信号在组合框中的lineEdit内容发生改变时触发,显然该信号并不适合。查阅资料得知,可通过重写QWidget的focusInEvent(focusOutEvent)方法来实现对组件获取鼠标焦点事件的捕获,但是这样还要再增加一个类比较麻烦。QWidget提供了eventFilter(QObject * watched,QEvent event)对注册了过滤器的组件的所有事件进行捕获,通过对事件进行判定我们就能够得到失去焦点事件。

   self.combo.installEventFilter(self)
  
   
def eventFilter(self, obj, event):
    AllItems = [self.combo.itemText(i) for i in range(self.combo.count())]
    if obj == self.combo:
        if event.type() == QEvent.FocusOut:
            if self.combo.lineEdit().text() not in AllItems and self.combo.lineEdit().text() != '':
                self.combo.addItem(self.combo.lineEdit().text());
    return QWidget.eventFilter(self,obj,event)

你可能感兴趣的:(PYQT5,qcombobox,可编辑添加item下拉框)