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

如何实现QLineEdit控件自动获取焦点?(条码扫描输入场景)

嘿,这个需求太贴合条码扫描的场景了——毕竟没人想每次扫条码前还要手动点输入框。我看你的代码框架已经搭得差不多了,给你两个靠谱的实现方式,直接就能用:

方法1:初始化后直接设置焦点(简单直接)

在你的__init__方法里,创建完QLineEdit并添加到布局后,直接调用setFocus()就行。不过要记得指定焦点原因,让Qt明确这是程序主动设置的:

from qtmodern import styles, windows
from qtpy import QtGui, QtCore
from qtpy.QtWidgets import *
from qtpy.QtCore import Qt

class MyGui(QWidget):
    def __init__(self, parent=None):
        super(MyGui, self).__init__(parent)
        layout = QVBoxLayout()
        self.lineEdit = QLineEdit()
        layout.addWidget(self.lineEdit)
        self.setLayout(layout)
        
        # 主动给输入框设置焦点
        self.lineEdit.setFocus(Qt.FocusReason.OtherFocusReason)
方法2:重写showEvent(更稳妥)

有时候窗口还没完全显示就调用setFocus可能不生效,这时候可以在窗口显示的瞬间设置焦点,确保控件已经完全初始化:

from qtmodern import styles, windows
from qtpy import QtGui, QtCore
from qtpy.QtWidgets import *
from qtpy.QtCore import Qt

class MyGui(QWidget):
    def __init__(self, parent=None):
        super(MyGui, self).__init__(parent)
        layout = QVBoxLayout()
        self.lineEdit = QLineEdit()
        layout.addWidget(self.lineEdit)
        self.setLayout(layout)

    def showEvent(self, event):
        super().showEvent(event)
        # 窗口显示后立即让输入框获焦
        self.lineEdit.setFocus(Qt.FocusReason.OtherFocusReason)
额外提醒
  • 别给QLineEdit设置setReadOnly(True),只读状态下输入框是没法获取焦点接收输入的
  • 如果用了qtmodern的ModernWindow包装窗口,确保主窗口本身能正常获取焦点,不然输入框也没法拿到焦点

这样设置完,打开窗口后输入框就会自动获焦,条码扫描的内容直接就能进去啦~

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

火山引擎 最新活动