2017-10-10 6 views
1

Je suis très nouveau sur Python et Qt Designer. En utilisant le code donné, je veux que l'utilisateur saisisse du texte dans le widget QLineEdit, appuyez sur Copier! bouton et voir le texte entré remplacer l'étiquette 'N/A'. Mes questions sont: suivant cette procédure, comment puis-je effacer le texte entré dans le widget QLineEdit avec un simple clic de souris?PyQt: Effacer QLineEdit sur l'événement click

D'après ce que je lis (this, this et this) il semble que je dois réimplémentez focusInEvent() dans une nouvelle classe extension QLineEdit. Mon problème est que le code de mon GUI a été importé de Qt Designer en utilisant pyuic5 et les exemples cités ci-dessus ne semblent pas en tenir compte.

Voici mon code:

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() 

Voici mon fichier converti .ui:

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")) 

Merci!

+0

Pourquoi ne pas simplement effacer la ligne modifier automatiquement au lieu d'exiger un supplément un clic de souris? Aussi, ne serait-il pas plus agréable si l'utilisateur pouvait simplement appuyer sur Entrée pour copier le texte? – ekhumoro

+0

@ekhumoro L'application sur laquelle je travaille utilise les champs QLineEdit un peu différemment de l'exemple donné. Après que l'utilisateur ait entré un code de téléscripteur, le texte entré est modifié pour afficher le nom complet de l'entreprise associé au code de téléscripteur entré par l'utilisateur (comme référence et confirmation). Le raccourci d'entrée a été implémenté dans mon exemple. – adam

+0

Je ne comprends toujours pas pourquoi vous avez besoin d'un clic supplémentaire. Pourquoi ne pas simplement réinitialiser le line-edit dans le slot 'copy_and_print'? Et si l'utilisateur veut utiliser la souris pour déplacer le curseur dans le line-edit? Ce serait très agaçant si cela effaçait le texte actuel. – ekhumoro

Répondre

0

La solution est de promouvoir QtDesigner utiliser notre QLineEdit personnalisé où nous implémentons le signal cliqué à l'aide de mousePressEvent, cette classe s'appellera ClickableLineEdit et le fichier s'appellera 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) 

Pour la promouvoir, la structure suivante sera considérée:

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

Ouvrez le design avec Qt Designer et faites un clic droit sur le QLineEdit et sélectionnez Promote to ...:

enter image description here

Un menu ouvert et placez le

suivant

enter image description here

puis appuyez sur et promouvez. Ensuite, nous générons le code à nouveau.

Ensuite, nous nous connectons le signal clair:

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()) 
+0

Merci pour la réponse rapide, j'avais effectivement raté cette option. Cela dit, est-il possible de reproduire le même comportement sans clearButton? En faisant cliquer l'utilisateur n'importe où dans le champ QLineEdit? Aussi, si ce n'est pas possible, les couleurs du clearButton peuvent-elles être modifiées? – adam

+0

@adam J'ai déjà mis à jour ma réponse, essayez-la et si cela fonctionne marquez-la comme s'il vous plaît. – eyllanesc

+0

Désolé à ce sujet. Je reviendrai vers vous dès que j'aurai essayé votre solution. Je vous remercie. – adam