2010-09-23 331 views
4

我想让QCompleter匹配几个用逗号分隔的等价选项。看起来有没有简单的方法来做到这一点,但一行QCompleter引用引起了我的注意,描述函数QCompleter :: splitPath:“当与列表模型一起使用时,返回列表中的第一项用于匹配。”这可以用我需要的方式 - 分割输入字符串并将其返回,以便未完成的最后一项是列表中的第一项?我没有设法使其工作,但我可能做错了什么。Qt QCompleter多个匹配

+0

澄清:用户输入的字符串是否用逗号分隔? – Live 2010-09-23 15:21:34

回答

1

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

但是,在每个逗号之后,模型的索引(像它的二维数组字符串)将会增加。

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

ABCD,EFGH,IJ

,你想完成者完成IJ KL,你就必须有一个模型,它是至少3个索引宽,因为第一个文本(ABCD)将与第一列中的字符串一起完成,EFGH将与您的模型的第二列一起完成等。

因此,我不知道它是否可以在你的应用程序中使用。

祝你好运。

4

这是另一种做法,我认为更符合原始问题。不需要复杂的数据模型,而是使用简单的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_()) 
0

支持成员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]