5

QCompleter を、コンマで区切られたいくつかの同等のオプションに一致させようとしています。これを行う簡単な方法はないように見えますが、QCompleter リファレンスの 1 行で、関数 QCompleter::splitPath: "リスト モデルで使用すると、返されたリストの最初の項目が照合に使用されます" と説明されていることに注意を引きました。これを必要な方法で使用できますか?入力文字列を分割して返すと、未完成の最後のアイテムがリストの最初になりますか? 私はそれを機能させることができませんでしたが、何か間違ったことをしている可能性があります。

4

3 に答える 3

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_())
于 2011-04-04T18:38:50.640 に答える
1

あなたの質問とドキュメントから私が理解していることから、ユーザーが入力した文字列をコンマで区切り、モデルで完了をチェックすることができます。

ただし、各コンマの後、モデルのインデックス (文字列の 2 次元配列のように考えてください) がインクリメントされます。

たとえば、次の入力があるとします。

ABCD、EFGH、IJ

コンプリーターに IJ KLを終了させたい場合、最初のテキスト (ABCD) が最初の列の文字列で完了するため、少なくとも 3 つのインデックス幅のモデルが必要です。EFGH は、モデルの 2 列目など。

したがって、アプリケーションで使用できるかどうかはわかりません。

幸運を祈ります。

于 2010-09-23T15:31:50.143 に答える