我正在尝试使QCompleter匹配几个用逗号分隔的等效选项。似乎没有简单的方法可以做到这一点,但是一行QCompleter引用引起了我的注意,描述了函数QCompleter :: splitPath:“当与列表模型一起使用时,返回列表中的第一项用于匹配。”这可以按照我需要的方式使用 - 拆分输入字符串并返回它,以便未完成的最后一项是列表中的第一项吗?我没有设法使它工作,但我可能做错了。
答案 0 :(得分:5)
这是另一种做法,我认为更符合原始问题。不需要复杂的数据模型,而是使用简单的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_())
答案 1 :(得分:1)
根据我对您的问题和文档的理解,您可以将用户输入的字符串与逗号分开,并在模型中进行完成检查以完成。
但是,在每个逗号之后,模型的索引(将其视为二维字符串数组)将递增。
例如,如果您有以下输入:
ABCD,EFGH,IJ
并且您希望完成者完成IJ KL ,您必须拥有一个至少3个索引宽的模型,因为第一个文本(ABCD)将使用字符串完成第一列,EFGH将与您的模型的第二列等完成。
所以,我不知道它是否可以在您的应用程序中使用。
祝你好运。
答案 2 :(得分: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]