如何在 PyQT 中的所有行编辑之间自动更改焦点?

Posted

技术标签:

【中文标题】如何在 PyQT 中的所有行编辑之间自动更改焦点?【英文标题】:How do I automatically change focus between all the line edits in PyQT? 【发布时间】:2020-03-14 20:37:19 【问题描述】:

我在一个程序中有一个简单的加密代码生成器。 当用户输入第一个数字时,我希望焦点自动切换到下一行编辑器(见附件截图)。我找不到任何明显的方法可以做到这一点。 我是 PyQT 的新手,所以我想知道是否有人知道这怎么可能?

谢谢

【问题讨论】:

您的描述令人困惑。我什么时候输入数字或数字?数字是0、1、2、3、4、5、6、7、8、9等,数字是数字的组合。 我猜你需要在 QLineEdit 上使用 setFocus()。如果您上传您的代码,我可能会指导您找到解决方案。也许这个答案也可能对您有所帮助。 ***.com/questions/49418905/… @NicholasTJ 类似于self.le1.textEdited.connect(self.le2.setFocus) 的行编辑1、2、3? @Guimute Yes :) 这就是我的想法,干杯! @eyllanesc 为混乱道歉。用户将输入一个数字 (0-9),然后它将滚动到下一行编辑器。 【参考方案1】:

给你:

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QLineEdit
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtCore import QSize    


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(320, 240))    
        self.setWindowTitle("Keyword") 
        self.anchor = []

        # Line Edit 1
        self.nameLabel = QLabel(self)
        self.nameLabel.setText('#1')
        self.line1 = QLineEdit(self)
        self.line1.move(80, 20)
        self.line1.resize(200, 32)
        self.nameLabel.move(20, 20)
        self.anchor.append(self.line1)

        # Line Edit 2
        self.nameLabel2 = QLabel(self)
        self.nameLabel2.setText('#2')
        self.line2 = QLineEdit(self)
        self.line2.move(80, 60)
        self.line2.resize(200, 32)
        self.nameLabel2.move(20, 60)
        self.anchor.append(self.line2)

        # Line Edit 3
        self.nameLabel3 = QLabel(self)
        self.nameLabel3.setText('#3')
        self.line3 = QLineEdit(self)
        self.line3.move(80, 100)
        self.line3.resize(200, 32)
        self.nameLabel3.move(20, 100)
        self.anchor.append(self.line3)

        # Line Edit 4
        self.nameLabel4 = QLabel(self)
        self.nameLabel4.setText('#4')
        self.line4 = QLineEdit(self)
        self.line4.move(80, 140)
        self.line4.resize(200, 32)
        self.nameLabel4.move(20, 140)
        self.anchor.append(self.line4)

        # Button
        pybutton = QPushButton('OK', self)
        pybutton.clicked.connect(self.clickMethod)
        pybutton.resize(200,32)
        pybutton.move(80, 200)        

        # Connect
        self.line1.textEdited.connect(lambda state, x=1: self.checkDigit(x))
        self.line2.textEdited.connect(lambda state, x=2: self.checkDigit(x))
        self.line3.textEdited.connect(lambda state, x=3: self.checkDigit(x))
        self.line4.textEdited.connect(lambda state, x=4: self.checkDigit(x))

    def checkDigit(self, data):
        try:
            if (int(self.anchor[data-1].text()) < 10):
                self.anchor[data].setFocus()
        except:
            pass

    def clickMethod(self):
        print("Your four digits are:" + 
              " " + self.line1.text() + 
              " " + self.line2.text() +
              " " + self.line3.text() +
              " " + self.line4.text())

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit( app.exec_() )

【讨论】:

以上是关于如何在 PyQT 中的所有行编辑之间自动更改焦点?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 - 使用 Line Edit 从编辑窗口更新标签

pyqt5 永久小部件焦点

如何使用箭头键更改小部件之间的焦点?

iOS:文本字段委托,如何在处理表格视图中的行移动之前自动结束编辑?

PyQt:初始化重置的默认值

使用 pyqt4 创建类信号