如何在 pyQt 中获取激活的 qlineEdit 或标签

How to get an activeted lineEdit or label in pyQt

我正在尝试获得一个 lineEdit,当单击一个按钮时,其中有一个光标。例如:我 运行 应用程序,将光标放在一个 lineEdit 中,然后单击按钮时 - 应在所选的 lineEdit 中设置一些文本。

我试过使用 keyboardGrabber,但 returns 按钮 =None。

import sys
from PyQt5 import QtWidgets, QtCore


class Mainwindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("window")
        self.lineEdit1 = QtWidgets.QLineEdit()
        self.lineEdit2 = QtWidgets.QLineEdit()
        self.lineEdit3 = QtWidgets.QLineEdit()
        self.pushButton = QtWidgets.QPushButton()
        self.label = QtWidgets.QLabel()
        self.label.setText('#1')
        self.frame = QtWidgets.QFrame(self)
        self.frame.setGeometry(QtCore.QRect(0, 0, 200, 100))
        self.gridLayout =  QtWidgets.QGridLayout(self.frame)
        self.gridLayout.addWidget(self.lineEdit1, 0, 0, 1, 1)
        self.gridLayout.addWidget(self.lineEdit2, 0, 1, 1, 1)
        self.gridLayout.addWidget(self.lineEdit3, 0, 2, 1, 1)
        self.gridLayout.addWidget(self.label, 0, 3, 1, 1)
        self.gridLayout.addWidget(self.pushButton, 1, 0, 1, 1)

        self.pushButton.clicked.connect(self.function)

    def function(self):
        widget = self.keyboardGrabber()
        widget.setText('some text')



if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    application = Mainwindow()
    application.show()

试一试:void QApplication::focusChanged(QWidget *old, QWidget *now)

当具有键盘焦点的小部件从旧更改为现在时,即因为用户按下 tab 键、单击进入小部件或更改活动 window 时,会发出此信号。 old 和 now 都可以是 nullptr.

import sys
from PyQt5 import QtWidgets, QtCore


class Mainwindow(QtWidgets.QMainWindow):  # QMainWindow  QWidget
    def __init__(self):
        super().__init__()

        QtWidgets.qApp.focusChanged.connect(self.on_focusChanged)       # +++

        self.setWindowTitle("window")
        self.lineEdit1 = QtWidgets.QLineEdit(self)
        self.lineEdit1.setFocus()                                       # +

        self.lineEdit2 = QtWidgets.QLineEdit()
        self.lineEdit3 = QtWidgets.QLineEdit()
        self.pushButton = QtWidgets.QPushButton()
        self.label = QtWidgets.QLabel()
        self.label.setText('#1')

        self.frame = QtWidgets.QFrame(self)
        self.setCentralWidget(self.frame)                               # +
        self.frame.setGeometry(QtCore.QRect(0, 0, 200, 100))
        self.gridLayout =  QtWidgets.QGridLayout(self.frame)

        self.gridLayout.addWidget(self.lineEdit1, 0, 0, 1, 1)
        self.gridLayout.addWidget(self.lineEdit2, 0, 1, 1, 1)
        self.gridLayout.addWidget(self.lineEdit3, 0, 2, 1, 1)
        self.gridLayout.addWidget(self.label, 0, 3, 1, 1)
        self.gridLayout.addWidget(self.pushButton, 1, 0, 1, 1)

        self.lineFocus = ...                                             # +++
        self.pushButton.clicked.connect(self.function)

    def function(self):
#        widget = self.keyboardGrabber()
#        widget.setText('some text')
        self.lineFocus.setText('some text')

    @QtCore.pyqtSlot("QWidget*", "QWidget*")
    def on_focusChanged(self, old, now):                                 # +++
        #print(f"\nold: {old}, now: {now}")
        self.lineFocus = old 


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    application = Mainwindow()
    application.show()
    sys.exit(app.exec_())