首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt QCompleter多匹配

Qt QCompleter多匹配
EN

Stack Overflow用户
提问于 2010-09-23 23:01:59
回答 3查看 2.8K关注 0票数 5

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

EN

回答 3

Stack Overflow用户

发布于 2011-04-05 02:38:51

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

代码语言:javascript
复制
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_())
票数 5
EN

Stack Overflow用户

发布于 2010-09-23 23:31:50

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

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

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

IJ,EFGH,IJ

你想要完成器来完成IJ KL,你必须有一个至少有3个索引宽度的模型,因为第一个文本(ABCD)将用第一列中的字符串完成,EFGH将用模型的第二列完成,等等。

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

祝你好运。

票数 1
EN

Stack Overflow用户

发布于 2015-10-28 23:04:39

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

代码语言:javascript
复制
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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3779720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档