You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PyQt4 QLineEdit自动补全后如何将光标定位至文本起始位置

解决QLineEdit补全后光标定位到开头的问题

我完全明白你遇到的困扰——使用QCompleter选中补全文本后,QLineEdit的光标总是自动跳到文本末尾,而你希望它直接定位到文本起始位置。咱们可以通过监听QCompleter的激活信号,在补全动作完成后手动调整光标位置来解决这个问题。

修改后的完整代码

import sys
from PyQt4.QtCore import Qt, QTimer
from PyQt4.QtGui import QApplication, QCompleter, QLineEdit, QStringListModel

def get_data(model):
    model.setStringList(["completion_xxxxxxxxxx", "data_yyyyyyyyyy", "goes_ccccccccc", "here"])

def set_cursor_to_start():
    # 补全完成后将光标设置到文本开头
    edit.setCursorPosition(0)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    edit = QLineEdit()
    edit.setCursorPosition(0)
    
    completer = QCompleter()
    edit.setCompleter(completer)
    
    model = QStringListModel()
    completer.setModel(model)
    get_data(model)
    
    # 连接补全激活信号到光标设置函数,用QTimer确保文本已更新
    completer.activated.connect(lambda: QTimer.singleShot(0, set_cursor_to_start))
    
    edit.show()
    sys.exit(app.exec_())

关键修改说明

  • 新增了set_cursor_to_start函数,负责将QLineEdit的光标位置设置为0(文本开头)。
  • 使用QTimer.singleShot(0, ...)来延迟执行光标设置:这是因为QCompleter的activated信号触发时,文本可能还没有完全填充到QLineEdit中,延迟到事件循环的下一轮执行可以确保文本已经更新完毕,再调整光标位置才会生效。
  • 将QCompleter的activated信号连接到这个延迟执行的光标设置操作,这样每次选中补全选项后,都会自动把光标移到文本开头。

内容的提问来源于stack exchange,提问作者gowthami

火山引擎 最新活动