PyQt: Borrar QLineEdit en evento click

Soy muy nuevo en Python y Qt Designer. Usando el código dado, quiero que el usuario ingrese texto en el widget QLineEdit, presione la tecla Copiar! y vea que el texto introducido reemplace la etiqueta ‘N / A’. Mis preguntas son: siguiendo este procedimiento, ¿cómo puedo borrar el texto ingresado en el widget QLineEdit con un simple clic del mouse?

Por lo que leí ( esto , esto y esto ) parece que necesito volver a implementar focusInEvent () en una nueva clase que extiende QLineEdit. Mi problema es que el código para mi GUI se ha importado de Qt Designer utilizando pyuic5 y los ejemplos citados anteriormente no parecen tener esto en cuenta.

Aquí está mi código:

from PyQt5.QtWidgets import * import sys import QLineEdit_test class MainWindow(QMainWindow, QLineEdit_test.Ui_QLineEdit_test): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.copy_button.clicked.connect(self.copy_and_print) def copy_and_print(self): self.label.setText(self.lineEdit.text()) def main(): app = QApplication(sys.argv) form = MainWindow() form.show() app.exec_() if __name__ == "__main__": main() 

Aquí está mi archivo .ui convertido:

 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_QLineEdit_test(object): def setupUi(self, QLineEdit_test): QLineEdit_test.setObjectName("QLineEdit_test") QLineEdit_test.resize(300, 200) QLineEdit_test.setMaximumSize(QtCore.QSize(300, 200)) self.centralwidget = QtWidgets.QWidget(QLineEdit_test) self.centralwidget.setObjectName("centralwidget") self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setObjectName("gridLayout") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setMaximumSize(QtCore.QSize(120, 16777215)) self.lineEdit.setObjectName("lineEdit") self.gridLayout.addWidget(self.lineEdit, 0, 0, 1, 1) self.copy_button = QtWidgets.QPushButton(self.centralwidget) self.copy_button.setObjectName("copy_button") self.gridLayout.addWidget(self.copy_button, 1, 0, 1, 1) self.label = QtWidgets.QLabel(self.centralwidget) self.label.setMaximumSize(QtCore.QSize(200, 20)) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName("label") self.gridLayout.addWidget(self.label, 2, 0, 1, 1) self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) QLineEdit_test.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(QLineEdit_test) self.menubar.setGeometry(QtCore.QRect(0, 0, 300, 22)) self.menubar.setObjectName("menubar") QLineEdit_test.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(QLineEdit_test) self.statusbar.setObjectName("statusbar") QLineEdit_test.setStatusBar(self.statusbar) self.retranslateUi(QLineEdit_test) QtCore.QMetaObject.connectSlotsByName(QLineEdit_test) def retranslateUi(self, QLineEdit_test): _translate = QtCore.QCoreApplication.translate QLineEdit_test.setWindowTitle(_translate("QLineEdit_test", "MainWindow")) self.copy_button.setText(_translate("QLineEdit_test", "Copy!")) self.copy_button.setShortcut(_translate("QLineEdit_test", "Return")) self.label.setText(_translate("QLineEdit_test", "N/A")) 

Gracias !

La solución es promover QtDesigner utilizando nuestro QLineEdit personalizado donde implementamos la señal pulsada con la ayuda de mousePressEvent, esta clase se llamará ClickableLineEdit y el archivo se llamará ClickableLineEdit.py.

ClickableLineEdit.py

 from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QLineEdit class ClickableLineEdit(QLineEdit): clicked = pyqtSignal() def mousePressEvent(self, event): self.clicked.emit() QLineEdit.mousePressEvent(self, event) 

Para promocionarlo, se considerará la siguiente estructura:

 . ├── ClickableLineEdit.py ├── main.py ├── your.ui └── QLineEdit_test.py 

Abra el diseño con Qt Designer, haga clic con el botón derecho en QLineEdit y seleccione Promote to ... :

introduzca la descripción de la imagen aquí

Se abrirá un menú y se colocará lo siguiente.

introduzca la descripción de la imagen aquí

A continuación, pulse y promocionar. Luego generamos el código de nuevo.

Luego conectamos la señal para borrar:

 class MainWindow(QMainWindow, QLineEdit_test.Ui_QLineEdit_test): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.copy_button.clicked.connect(self.copy_and_print) self.lineEdit.clicked.connect(self.lineEdit.clear) def copy_and_print(self): self.label.setText(self.lineEdit.text())