弹出QStyledItemDelegate中的QCompleter,无需文本输入即可立即删除

2024-05-14 04:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个QTableWidget列的QCompleter。一旦用户开始编辑我希望完成弹出窗口,而不是等待他们输入文本第一。我将QStyledItemDelegate的setEditorData函数子类化,这样做对我来说似乎最有意义,但是当我调用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)

Tags: self编辑indexdefediteditorparentcomplete
1条回答
网友
1楼 · 发布于 2024-05-14 04:20:43

当小部件显示时,必须调用^{},为此可以使用^{}方法:

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))

相关问题 更多 >