Всплывающее QCompleter в QStyledItemDelegate сразу без ввода текста - PullRequest
1 голос
/ 31 октября 2019

У меня есть QCompleter в столбце QTableWidget. Как только пользователь начнет редактирование, я бы хотел, чтобы всплывающее окно всплыло, а не дожидалось, пока он введет текст. Я подклассифицировал функцию setEditorData в QStyledItemDelegate, чтобы сделать это, что мне кажется наиболее целесообразным, однако, когда я вызываю completer.complete(), ничего не происходит, пока я не закончу редактирование (в этот момент всплывающее окно срабатывает).

Здесьмой код для делегата:

class CompleterItemDelegate(QtGui.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        completer = QtGui.QCompleter(['test', 'test2'])
        completer.setCompletionMode(completer.UnfilteredPopupCompletion)

        edit = QtGui.QLineEdit(parent)
        edit.setCompleter(completer)
        return edit

    def setEditorData(self, editor, index):
        completer = editor.completer()
        completer.complete() # does not fire until after editing is done
        completer.popup().show() # no luck here either
        print("setting editor data") # this however does work as expected...
        super().setEditorData(editor, index)

1 Ответ

0 голосов
/ 31 октября 2019

Вы должны позвонить complete(), когда виджет отображается, и для этого вы можете использовать метод showEvent():

from PyQt4 import QtCore, QtGui


class LineEdit(QtGui.QLineEdit):
    def showEvent(self, event):
        if self.completer() is not None:
            QtCore.QTimer.singleShot(0, self.completer().complete)
        super().showEvent(event)


class CompleterItemDelegate(QtGui.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        completer = QtGui.QCompleter(["test", "test2"])
        completer.setCompletionMode(QtGui.QCompleter.UnfilteredPopupCompletion)
        edit = LineEdit(parent)
        edit.setCompleter(completer)
        return edit


def main(args):
    app = QtGui.QApplication(args)

    w = QtGui.QTableWidget(4, 4)
    delegate = CompleterItemDelegate(w)
    w.setItemDelegate(delegate)
    w.show()

    ret = app.exec_()
    return ret


if __name__ == "__main__":
    import sys

    sys.exit(main(sys.argv))
...