第六国际 2023-12-14 18:55 采纳率: 46.7%
浏览 22
已结题

Pyqt 使用Qcompleter 自动补全时,如何避免用上下键去操作选项时,内容框里的内容也会跟着变化?


from PyQt5.QtWidgets import *
import sys

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        layout = QGridLayout()
        self.setLayout(layout)

        # auto complete options
        names = ["Apple", "Alps", "Berry", "Cherry" ]
        completer = QCompleter(names)

        # create line edit and add auto complete
        self.lineedit = QLineEdit()
        self.lineedit.setCompleter(completer)
        layout.addWidget(self.lineedit, 0, 0)

app = QApplication(sys.argv)
screen = Window()
screen.show()
sys.exit(app.exec_())

我现在的代码执行后,当我用键盘的上下键去选择匹配的下拉框元素时,输入框的内容会跟着变,怎么避免上下键引起输入框内容变化呀(我想要的效果是上下键只是选择元素的位置,我输入Enter 键时,输入框的内容才会变化)?

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-12-14 18:55
    关注

    引自强大而免费的微信小程序:皆我知道

    要实现这个效果,你可以通过重写QCompleter的event方法来实现。具体步骤如下:

    1. 创建一个自定义类,继承自QCompleter。
    2. 在自定义类中重写event方法。
    3. 在重写的event方法中,判断用户是否按下了上下键。如果是,调用QCompleter的setCurrentRow方法将选中行的索引设为-1,这样输入框的内容就不会跟着变化。
    4. 在重写的event方法中,还需要处理按下Enter键时,输入框内容的变化。可以通过监听Qt.Key_Enter或者Qt.Key_Return键的按下事件,在按下这两个键时,先调用父类的event方法,然后再根据当前选中的索引,更新输入框的内容。

    下面是一个示例代码:

    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QApplication, QLineEdit, QCompleter
    from PyQt5.QtGui import QStandardItemModel
    
    class CustomCompleter(QCompleter):
        def event(self, event):
            if event.type() == event.KeyPress:
                if event.key() in [Qt.Key_Up, Qt.Key_Down]:
                    self.setCurrentRow(-1)  # 处理上下键时,将选中行索引设为-1,不改变输入框内容
                elif event.key() in [Qt.Key_Enter, Qt.Key_Return]:
                    index = self.popup().currentIndex()
                    if index.isValid():
                        completion = self.popup().currentIndex().data()
                        event.accept()
                        self.popup().hide()
                        self.parent().setText(completion)  # 处理Enter键时,更新输入框内容
                        return True
            return super().event(event)
    
    if __name__ == "__main__":
        import sys
    
        app = QApplication(sys.argv)
     
        # 创建一个输入框和一个自动补全框
        line_edit = QLineEdit()
        completer = CustomCompleter()
        completer.setPopup(QLineEdit(line_edit))
        completer.setModel(QStandardItemModel())
        line_edit.setCompleter(completer)
     
        line_edit.show()
     
        sys.exit(app.exec_())
    

    这段代码创建了一个输入框和一个自动补全框。在输入框中输入内容时,会弹出匹配的补全选项。使用上下键去选择选项时,输入框不会跟着变化,只有在按下Enter键时,输入框的内容才会更新为选中的选项。

    请注意,这段代码只是一个示例,你需要根据自己的实际需求进行修改和调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 已采纳回答 12月14日
  • 修改了问题 12月14日
  • 创建了问题 12月14日