2017-10-10 906 views
1

我对Python和Qt Designer非常新颖。使用给定的代码,我希望用户在QLineEdit小部件中输入文本,按下Copy!按钮并看到输入的文本替换'N/A'标签。我的问题是:按照这个程序,我怎样才能通过简单的鼠标点击清除QLineEdit小部件中输入的文本?PyQt:点击事件清除QLineEdit

从我读到的(this,thisthis)看来我需要在扩展QLineEdit的新类中重新实现focusInEvent()。我的问题是我的GUI的代码已经使用pyuic5从Qt Designer导入,上面引用的例子似乎没有考虑到这一点。

这里是我的代码:

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

这是我转换的.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")) 

谢谢!

+0

为什么不清除行编辑自动,而不需要额外的鼠标点击?另外,如果用户只需按下输入键即可复制文本,这会不会更好? – ekhumoro

+0

@ekhumoro我正在使用的应用程序使用QLineEdit字段与给定示例代码有点不同。在用户输入股票代码后,输入的文本将更改为显示与用户输入的股票代码(作为参考和确认)关联的完整公司名称。我的示例中已经实现了输入快捷键。 – adam

+0

我仍然不明白为什么你需要额外的鼠标点击。为什么不重置'copy_and_print'插槽中的行编辑?如果用户想要使用鼠标在行编辑中移动插入符?如果这样能清除当前的文字,那将是非常烦人的。 – ekhumoro

回答

0

解决方案是促进QtDesigner使用我们的自定义QLineEdit,我们在mousePressEvent的帮助下实施信号点击,这个类将被称为ClickableLineEdit,该文件将被称为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) 

要推动它,以下结构将被视为:

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

开放式设计使用Qt Designer和右键点击QLineEdit的选择Promote to ...

enter image description here

菜单将打开,把下面的

enter image description here

然后按和推广。然后我们再次生成代码。

然后我们连接信号明确:

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

感谢您的快速回答,我确实错过了这个选项。话虽如此,是否有可能在没有clearButton的情况下复制相同的行为?通过让用户点击QLineEdit字段中的任何位置?另外,如果不可行,可以修改clearButton的颜色吗? – adam

+0

@adam我已经更新了我的答案,尝试一下,如果它起作用,请将其标记为正确。 – eyllanesc

+0

对不起。一旦我尝试了您的解决方案,我会尽快回复您。谢谢。 – adam