2010-09-23 336 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]