PySide QLineEdit的自动补全功能——auto-completion

  前段时间给项目里写了个小东西,需要QLineEdit这个东西,然后艺术家用的时候每次都要手动输入,自己就设想能不能添加个自动补全的功能呢,于是上网查了下,还真有,就是下面的两个方案,自己分别说下,第一种是,只在开头的位置自动补全,如果你一次输入好多单词,那么后面输入就没有自动补全了,相对也简单些,根据自己的需要定。
  代码如下:

import sys

from PySide.QtCore import Qt
from PySide.QtGui import QApplication, QCompleter, QLineEdit, QStringListModel


if __name__ == '__main__':
    app = QApplication(sys.argv)
    edit = QLineEdit()
    completer = QCompleter()
    edit.setCompleter(completer)

    model = QStringListModel()
    model.setStringList(['book', 'good', 'perfect', 'lousy', 'messy'])
    completer.setModel(model)

    edit.show()
    sys.exit(app.exec_())

这里写图片描述

这里写图片描述
  下面这种方式呢,是会进行多次自动补全,即使后面的输入也会进行自动补全。


from PySide import QtCore, QtGui

class AutoCompleteEdit(QtGui.QLineEdit):
    def __init__(self, model, separator=' ', addSpaceAfterCompleting=True):
        super(AutoCompleteEdit, self).__init__()
        self._separator = separator
        self._addSpaceAfterCompleting = addSpaceAfterCompleting
        self._completer = QtGui.QCompleter(model)
        self._completer.setWidget(self)
        self.connect(
            self._completer,
            QtCore.SIGNAL('activated(QString)'),
            self._insertCompletion)
        self._keysToIgnore = [QtCore.Qt.Key_Enter,
                              QtCore.Qt.Key_Return,
                              QtCore.Qt.Key_Escape,
                              QtCore.Qt.Key_Tab]

    def _insertCompletion(self, completion):

        extra = len(completion) - len(self._completer.completionPrefix())
        extra_text = completion[-extra:]
        if self._addSpaceAfterCompleting:
            extra_text += ', '
        self.setText(self.text() + extra_text)

    def textUnderCursor(self):
        text = self.text()
        textUnderCursor = ''
        i = self.cursorPosition() - 1
        while i >= 0 and text[i] != self._separator:
            textUnderCursor = text[i] + textUnderCursor
            i -= 1
        return textUnderCursor

    def keyPressEvent(self, event):
        if self._completer.popup().isVisible():
            if event.key() in self._keysToIgnore:
                event.ignore()
                return
        super(AutoCompleteEdit, self).keyPressEvent(event)
        completionPrefix = self.textUnderCursor()
        if completionPrefix != self._completer.completionPrefix():
            self._updateCompleterPopupItems(completionPrefix)
        if len(event.text()) > 0 and len(completionPrefix) > 0:
            self._completer.complete()
        if len(completionPrefix) == 0:
            self._completer.popup().hide()

    def _updateCompleterPopupItems(self, completionPrefix):

        self._completer.setCompletionPrefix(completionPrefix)
        self._completer.popup().setCurrentIndex(
            self._completer.completionModel().index(0, 0))


if __name__ == '__main__':
    def demo():
        import sys
        app = QtGui.QApplication(sys.argv)
        values = ['book', 'good', 'perfect', 'lousy', 'messy']
        editor = AutoCompleteEdit(values)
        window = QtGui.QWidget()
        hbox = QtGui.QHBoxLayout()
        hbox.addWidget(editor)
        window.setLayout(hbox)
        window.show()

        sys.exit(app.exec_())

    demo()

这里写图片描述

  这些内容并非自己原创,都是从网上收集起来分享个大家的。

猜你喜欢

转载自blog.csdn.net/lulongfei172006/article/details/79767179