【问题标题】:Qt QCompleter multiple matchesQt QCompleter 多重匹配
【发布时间】:2010-09-23 15:01:58
【问题描述】:

我试图让 QCompleter 匹配几个用逗号分隔的等效选项。似乎没有简单的方法可以做到这一点,但是 QCompleter 参考中的一行代码引起了我的注意,它描述了函数 QCompleter::splitPath:“当与列表模型一起使用时,返回列表中的第一项用于匹配。”这可以按我需要的方式使用吗 - 拆分输入字符串并返回它,以便未完成的最后一项是列表中的第一项?我没能成功,但我可能做错了什么。

【问题讨论】:

  • 澄清一下:是不是用户输入的字符串用逗号隔开?

标签: qt qcompleter


【解决方案1】:

这是另一种我认为更符合原始问题的方法。不需要复杂的数据模型,使用简单的 QStringListModel 代替。

import sys
from PyQt4 import QtCore, QtGui

class test(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        model = QtGui.QStringListModel()
        wordList = ['John Doe','Jane Doe','Albert Einstein', 'Alfred E Newman']
        model.setStringList(wordList)

        layout = QtGui.QVBoxLayout(self)
        self.line = QtGui.QLineEdit(self)
        layout.addWidget(self.line)

        complete = CustomCompleter(self)
        complete.setModel(model)
        complete.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        complete.setCompletionMode(0)
        complete.setWrapAround(False)

        self.line.setCompleter(complete)


class CustomCompleter(QtGui.QCompleter):
    def __init__(self, parent=None):
        QtGui.QCompleter.__init__(self, parent)

    def pathFromIndex(self, index):
        path = QtGui.QCompleter.pathFromIndex(self, index)

        lst = str(self.widget().text()).split(',')
        if len(lst) > 1:
            path = '%s, %s' % (','.join(lst[:-1]), path)

        return path

    def splitPath(self, path):
        path = str(path.split(',')[-1]).lstrip(' ')
        return [path]

#===============================================================================
# Unit Testing
#===============================================================================
if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = test()
    window.show()
    sys.exit(app.exec_())

【讨论】:

    【解决方案2】:

    根据我从您的问题和文档中了解到的情况,您可以用逗号分隔用户输入的字符串,并让您的完成者检查您的模型以完成。

    但是,在每个逗号之后,模型的索引(将其视为字符串的二维数组)将递增。

    例如,如果您有以下输入:

    ABCD、EFGH、IJ

    并且您希望完成者完成 IJ KL,您必须有一个至少 3 个索引宽的模型,因为第一个文本 (ABCD) 将使用字符串完成第一列,EFGH 将与您的模型的第二列一起完成,等等。

    所以,我不知道它是否可以在您的应用程序中使用。

    祝你好运。

    【讨论】:

      【解决方案3】:

      支持成员 DELIMITERS 中所有分隔符的通用多完成器代码可以在下面的代码片段中找到。这看起来很简单,但由于 pyQt 端的文档非常糟糕,调试起来非常烦人。

      class CustomCompleter(QtGui.QCompleter):
          DELIMITERS = r'[()\[\]*+-=/\\]'
          def __init__(self, parent=None):
              QtGui.QCompleter.__init__(self, parent)
          def pathFromIndex(self, index):
              path = QtGui.QCompleter.pathFromIndex(self, index)
              string = self.widget().text()
              split = re.split(self.DELIMITERS, string)[-1]
              if len(split)==len(string):
                  string_without_split = ''
              else:
                  if len(split)>0:
                      string_without_split = string[:-len(split)]
                  else:
                      string_without_split = string
              return string_without_split+path
      
          def splitPath(self, path):
              split = re.split(self.DELIMITERS, path)[-1]
              return [split]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多