【问题标题】:Popup QCompleter in QStyledItemDelegate immediately without text input在没有文本输入的情况下立即在 QStyledItemDelegate 中弹出 QCompleter
【发布时间】:2019-10-31 04:56:07
【问题描述】:

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

【问题讨论】:

    标签: python pyqt pyqt4


    【解决方案1】:

    您必须在显示小部件时调用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))
    

    【讨论】:

    • 嗯很遗憾对我不起作用,也许是 4.8 中的某种错误?
    • @Spencer 您是否仅尝试过我的示例或在您的项目中尝试过?我建议你先试试我的代码。
    • 我尝试了您的代码,有时我确实看到一个框闪烁,但只是片刻。没有错误或任何东西
    • 完美运行。聪明的! ;)
    猜你喜欢
    • 2012-02-24
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2013-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多