Python PyQt-使用QLineEdit多次自动完成

Python PyQt-使用QLineEdit多次自动完成,python,pyqt,pyqt5,qcompleter,Python,Pyqt,Pyqt5,Qcompleter,我希望能够在我的QLineEdit中多次使用自动补全符,我找到了使用qtexedit的示例,但我找不到用于QLineEdit。下面是我使用的一段代码(非常简单): 例如,如果我添加逗号,我希望完成符再次“开始预测”同一QLineEdit中的单词。 谢谢。我找到了答案,如果它能帮助其他人,我为Completer创建了一个类: class Completer(QtWidgets.QCompleter): def __init__(self, parent=None): su

我希望能够在我的
QLineEdit
中多次使用自动补全符,我找到了使用
qtexedit
的示例,但我找不到用于
QLineEdit
。下面是我使用的一段代码(非常简单):

例如,如果我添加逗号,我希望完成符再次“开始预测”同一
QLineEdit
中的单词。
谢谢。

我找到了答案,如果它能帮助其他人,我为Completer创建了一个类:

class Completer(QtWidgets.QCompleter):

    def __init__(self, parent=None):
        super(Completer, self).__init__(parent)

        self.setCaseSensitivity(Qt.CaseInsensitive)
        self.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
        self.setWrapAround(False)

    # Add texts instead of replace
    def pathFromIndex(self, index):
        path = QtWidgets.QCompleter.pathFromIndex(self, index)

        lst = str(self.widget().text()).split(',')

        if len(lst) > 1:
            path = '%s, %s' % (','.join(lst[:-1]), path)

        return path

    # Add operator to separate between texts
    def splitPath(self, path):
        path = str(path.split(',')[-1]).lstrip(' ')
        return [path]
我在QLineEdit的类中使用它,比如:

class TextEdit(QtWidgets.QLineEdit):

    def __init__(self, parent=None):
        super(TextEdit, self).__init__(parent)

        self.setPlaceholderText("example : ")
        self._completer = Completer(self)
        self.setCompleter(self._completer)

我找到了答案,如果它能帮助其他人,我为Completer创建了一个类:

class Completer(QtWidgets.QCompleter):

    def __init__(self, parent=None):
        super(Completer, self).__init__(parent)

        self.setCaseSensitivity(Qt.CaseInsensitive)
        self.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
        self.setWrapAround(False)

    # Add texts instead of replace
    def pathFromIndex(self, index):
        path = QtWidgets.QCompleter.pathFromIndex(self, index)

        lst = str(self.widget().text()).split(',')

        if len(lst) > 1:
            path = '%s, %s' % (','.join(lst[:-1]), path)

        return path

    # Add operator to separate between texts
    def splitPath(self, path):
        path = str(path.split(',')[-1]).lstrip(' ')
        return [path]
我在QLineEdit的类中使用它,比如:

class TextEdit(QtWidgets.QLineEdit):

    def __init__(self, parent=None):
        super(TextEdit, self).__init__(parent)

        self.setPlaceholderText("example : ")
        self._completer = Completer(self)
        self.setCompleter(self._completer)
PyQt4的解决方案:

from PyQt4 import QtCore, QtGui

class Completer(QtGui.QCompleter):
    def __init__(self, *args, **kwargs):
        super(Completer, self).__init__(*args, **kwargs)

        self.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.setCompletionMode(QtGui.QCompleter.PopupCompletion)
        self.setWrapAround(False)

    # Add texts instead of replace
    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]

class TextEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        super(TextEdit, self).__init__(parent)
        words = ["alpha", "omega", "omicron", "zeta"]
        self.setPlaceholderText("example : ")
        self._completer = Completer(words, self)
        self.setCompleter(self._completer)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = TextEdit()
    w.show()
    sys.exit(app.exec_())
PyQt4的解决方案:

from PyQt4 import QtCore, QtGui

class Completer(QtGui.QCompleter):
    def __init__(self, *args, **kwargs):
        super(Completer, self).__init__(*args, **kwargs)

        self.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.setCompletionMode(QtGui.QCompleter.PopupCompletion)
        self.setWrapAround(False)

    # Add texts instead of replace
    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]

class TextEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        super(TextEdit, self).__init__(parent)
        words = ["alpha", "omega", "omicron", "zeta"]
        self.setPlaceholderText("example : ")
        self._completer = Completer(words, self)
        self.setCompleter(self._completer)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = TextEdit()
    w.show()
    sys.exit(app.exec_())

以下是我发现的可能对某人有帮助的内容:

class LineEdit(QLineEdit):
    def __init__(self, *args, **kwargs):
        super(LineEdit,self).__init__( *args, **kwargs)
        self.multipleCompleter = None

    def keyPressEvent(self, event):
        QLineEdit.keyPressEvent(self, event)
        if not self.multipleCompleter:
            return
        c = self.multipleCompleter
        if self.text() == "":
            return
        c.setCompletionPrefix(self.cursorWord(self.text()))
        if len(c.completionPrefix()) < 1:
            c.popup().hide()
            return
        c.complete()

    def cursorWord(self, sentence):
        p = sentence.rfind(" ")
        if p == -1:
            return sentence
        return sentence[p + 1:]

    def insertCompletion(self, text):
        p = self.text().rfind(" ")
        if p == -1:
            self.setText(text)
        else:
            self.setText(self.text()[:p+1]+ text)

    def setMultipleCompleter(self, completer):
        self.multipleCompleter = completer
        self.multipleCompleter.setWidget(self)
        completer.activated.connect(self.insertCompletion)


def main():
    app = QApplication(sys.argv)
    w = LineEdit()
    completer = QCompleter(["Animals", "Dogs", "Birds", "Cats", "Elephant", "Zebra"])
    completer.setCaseSensitivity(Qt.CaseInsensitive)
    w.setMultipleCompleter(completer)
    w.show()
    sys.exit(app.exec_())
类行编辑(QLineEdit):
定义初始化(self,*args,**kwargs):
超级(行编辑,自).\uuuuu初始化(*args,**kwargs)
self.multipleCompleter=无
def按键事件(自身,事件):
QLineEdit.keyPressEvent(自,事件)
如果不是self.multipleCompleter:
回来
c=自复式完成器
如果self.text()==“”:
回来
c、 setCompletionPrefix(self.cursorWord(self.text()))
如果len(c.completionPrefix())小于1:
c、 popup().hide()
回来
c、 完成()
def cursorWord(self,句子):
p=句子.rfind(“”)
如果p==-1:
返回判决
返回句[p+1:]
def insertCompletion(自身,文本):
p=self.text().rfind(“”)
如果p==-1:
self.setText(文本)
其他:
self.setText(self.text()[:p+1]+text)
def setMultipleCompleter(自我,完成器):
self.multipleCompleter=completer
self.multipleCompleter.setWidget(self)
completer.activated.connect(self.insertCompletion)
def main():
app=QApplication(sys.argv)
w=LineEdit()
completer=QCompleter([“动物”、“狗”、“鸟”、“猫”、“大象”、“斑马”])
completer.SetCaseSensitive(Qt.CaseSensitive)
w、 setMultipleCompleter(完成器)
w、 show()
sys.exit(app.exec_())

以下是我发现的可能对某人有帮助的内容:

class LineEdit(QLineEdit):
    def __init__(self, *args, **kwargs):
        super(LineEdit,self).__init__( *args, **kwargs)
        self.multipleCompleter = None

    def keyPressEvent(self, event):
        QLineEdit.keyPressEvent(self, event)
        if not self.multipleCompleter:
            return
        c = self.multipleCompleter
        if self.text() == "":
            return
        c.setCompletionPrefix(self.cursorWord(self.text()))
        if len(c.completionPrefix()) < 1:
            c.popup().hide()
            return
        c.complete()

    def cursorWord(self, sentence):
        p = sentence.rfind(" ")
        if p == -1:
            return sentence
        return sentence[p + 1:]

    def insertCompletion(self, text):
        p = self.text().rfind(" ")
        if p == -1:
            self.setText(text)
        else:
            self.setText(self.text()[:p+1]+ text)

    def setMultipleCompleter(self, completer):
        self.multipleCompleter = completer
        self.multipleCompleter.setWidget(self)
        completer.activated.connect(self.insertCompletion)


def main():
    app = QApplication(sys.argv)
    w = LineEdit()
    completer = QCompleter(["Animals", "Dogs", "Birds", "Cats", "Elephant", "Zebra"])
    completer.setCaseSensitivity(Qt.CaseInsensitive)
    w.setMultipleCompleter(completer)
    w.show()
    sys.exit(app.exec_())
类行编辑(QLineEdit):
定义初始化(self,*args,**kwargs):
超级(行编辑,自).\uuuuu初始化(*args,**kwargs)
self.multipleCompleter=无
def按键事件(自身,事件):
QLineEdit.keyPressEvent(自,事件)
如果不是self.multipleCompleter:
回来
c=自复式完成器
如果self.text()==“”:
回来
c、 setCompletionPrefix(self.cursorWord(self.text()))
如果len(c.completionPrefix())小于1:
c、 popup().hide()
回来
c、 完成()
def cursorWord(self,句子):
p=句子.rfind(“”)
如果p==-1:
返回判决
返回句[p+1:]
def insertCompletion(自身,文本):
p=self.text().rfind(“”)
如果p==-1:
self.setText(文本)
其他:
self.setText(self.text()[:p+1]+text)
def setMultipleCompleter(自我,完成器):
self.multipleCompleter=completer
self.multipleCompleter.setWidget(self)
completer.activated.connect(self.insertCompletion)
def main():
app=QApplication(sys.argv)
w=LineEdit()
completer=QCompleter([“动物”、“狗”、“鸟”、“猫”、“大象”、“斑马”])
completer.SetCaseSensitive(Qt.CaseSensitive)
w、 setMultipleCompleter(完成器)
w、 show()
sys.exit(app.exec_())

您好,欢迎来到,也许您可以解释一下您的代码。这样,不熟悉python的人也可以理解代码。这样,不熟悉python的人也可以理解代码。