Python 3.x 通过动态搜索和自动完成将旧值返回到组合框

Python 3.x 通过动态搜索和自动完成将旧值返回到组合框,python-3.x,combobox,pyqt5,Python 3.x,Combobox,Pyqt5,我有一个重新实现的组合框,可以执行动态搜索和自动完成(代码不是我的)。问题是,当我键入与组合框列表中的任何值都不匹配的内容并按enter键时,我收到一个空字符串。但我希望接收一个旧值,在我开始键入其他值之前,它在combobox中。有人能帮我吗 我还想问ExtendedComboBox类中两个字符串的含义(只要代码不是我的): 如果文本为,则在激活的_completer_上的函数内有表达式;我不明白这是什么意思,因为我总是写整个表达式(比如如果text==True:或者类似的东西) 我不理解se

我有一个重新实现的组合框,可以执行动态搜索和自动完成(代码不是我的)。问题是,当我键入与组合框列表中的任何值都不匹配的内容并按enter键时,我收到一个空字符串。但我希望接收一个旧值,在我开始键入其他值之前,它在combobox中。有人能帮我吗

我还想问
ExtendedComboBox
类中两个字符串的含义(只要代码不是我的):

  • 如果文本为,则在激活的_completer_上的函数
    内有表达式
    ;我不明白这是什么意思,因为我总是写整个表达式(比如
    如果text==True:
    或者类似的东西)
  • 我不理解self.activated[str].emit(self.itemText(index))行中[str]的含义。我从未在
    pyqt
    中看到过当方括号中的内容直接出现在信号之后时的这种构造
  • 代码:


    当组合框设置为可编辑时,默认情况下,按return键时,允许在当前模型底部插入不存在的项。由于该代码中使用的模型是不可编辑的,当按返回键时,无法识别文本,组合框无法添加新项(并选择它),这导致将索引设置为-1

    您可以连接嵌入式QLineEdit信号,检查当前索引是否有效;这是可能的,因为信号之前也连接到组合框插入,所以当您收到信号时,组合框已经尝试添加新项,并最终设置(可能)无效索引

    为了存储上一个索引,只需连接到并保存它,只要它大于或等于0即可

    class ExtendedComboBox(QtWidgets.QComboBox):
        def __init__(self, parent=None):
            # ...
            self.lineEdit().returnPressed.connect(self.returnPressed)
            self.currentIndexChanged.connect(self.storePreviousIndex)
            self.previousIndex = self.currentIndex()
    
        def storePreviousIndex(self, index):
            if index >= 0:
                self.previousIndex = index
    
        def returnPressed(self):
            if self.currentIndex() < 0 or self.currentText() != self.itemText(self.currentIndex()):
                self.setCurrentIndex(self.previousIndex)
    
    class ExtendedComboBox(qtwidts.QComboBox):
    def uuu init uuu(self,parent=None):
    # ...
    self.lineEdit().returnPressed.connect(self.returnPressed)
    self.currentIndexChanged.connect(self.storePreviousIndex)
    self.previousIndex=self.currentIndex()
    def storePreviousIndex(自身,索引):
    如果索引>=0:
    self.previousIndex=索引
    def返回按下(自):
    如果self.currentIndex()小于0或self.currentText()!=self.itemText(self.currentIndex()):
    self.setCurrentIndex(self.previousIndex)
    
    请注意,
    returnPressed
    中的第二个比较是在未调用
    setModel()
    且插入策略为
    NoInsert
    的情况下,为默认内部模型添加兼容性

    关于最后两个问题:

    • if
      语句检查条件是否为真,或者如果需要,条件是否为假,如“NotNothing”(又名,false,0,None);您可以使用简单的语句进行一些实验,以更好地理解:
      如果为True:
      如果为1:
      如果为“某物”:
      将全部作为有效条件,而
      如果为False:
      如果为0:
      如果为“”:
      则不是
    • 有些信号的参数有多个签名,这意味着同一信号可以发出多次,每次都有不同类型的参数;例如,QComboBox的
      激活的
      信号会发出两次,第一次是带有新的当前索引的
      int
      ,然后带有新的当前文本;每当您想要连接(或发出)不是默认重载的重载时,都需要在括号中指定签名。在上面的例子中,只为
      str
      签名显式发出信号(但我不知道为什么
      int
      没有)。请注意,过载信号在Qt中逐渐消除(事实上,自Qt 5.14以来,
      activated()
      [str]
      签名被认为是过时的)
    class ExtendedComboBox(QtWidgets.QComboBox):
        def __init__(self, parent=None):
            # ...
            self.lineEdit().returnPressed.connect(self.returnPressed)
            self.currentIndexChanged.connect(self.storePreviousIndex)
            self.previousIndex = self.currentIndex()
    
        def storePreviousIndex(self, index):
            if index >= 0:
                self.previousIndex = index
    
        def returnPressed(self):
            if self.currentIndex() < 0 or self.currentText() != self.itemText(self.currentIndex()):
                self.setCurrentIndex(self.previousIndex)