如果点击眼睛图标Show/Hide密码(QPushButton)

If click Eyes icon Show/Hide password (QPushButton)

我正在尝试使用 QLineEdit 在注册和登录表单中创建一个函数,以便在单击 QPushButton 时显示和隐藏密码。我是 Python 的初学者,我只是想尝试一下,但是很难......我的尝试并不好,因为如果我点击眼睛按钮,密码会显示,但如果再次点击隐藏它不起作用。

from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QPushButton, QLineEdit
import sys
import pymysql
pymysql.install_as_MySQLdb()

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self, maxWidth=None):
        super(MyWindow, self).__init__()
        uic.loadUi('MainWindow.ui', self)

        self.eyepass_show()
        self.eyepass_hide()

        self.btn_show_pwd.clicked.connect(self.eyepass_hide)
        self.btn_show_pwd.clicked.connect(self.eyepass_show)

    def eyepass_show(self):
        self.line_password.setEchoMode(QLineEdit.Normal)
        print('show pass')

    def eyepass_hide(self):
        self.line_password.setEchoMode(QLineEdit.Password)
        print('hide pass')


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

表单密码hide/show眼睛:

显示隐藏密码,但如果再次单击隐藏密码不起作用

无需创建 eyepass_showeyepass_hide 两个单独的方法,您可以创建一个函数并切换可见性。此外,您正尝试通过 self.btn_show_pwd.clicked.connect(self.eyepass_hide)self.btn_show_pwd.clicked.connect(self.eyepass_show)

将同一信号两次连接到两种不同的方法

尝试这样的事情:

from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QPushButton, QLineEdit
import sys
import pymysql
pymysql.install_as_MySQLdb()

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self, maxWidth=None):
        super(MyWindow, self).__init__()
        uic.loadUi('MainWindow.ui', self)

        self.eyepass_show()
        self.eyepass_hide()
        self.btn_show_pwd.clicked.connect(self.toggleVisibility)
        
    def toggleVisibility(self):
        if self.line_password.echoMode()==QLineEdit.Normal:
            self.line_password.setEchoMode(QLineEdit.Password)
        else:
            self.line_password.setEchoMode(QLineEdit.Normal)

    #     self.btn_show_pwd.clicked.connect(self.eyepass_hide)
    #     self.btn_show_pwd.clicked.connect(self.eyepass_show)
    # 
    # def eyepass_show(self):
    #     self.line_password.setEchoMode(QLineEdit.Normal)
    #     print('show pass')
    # 
    # def eyepass_hide(self):
    #     self.line_password.setEchoMode(QLineEdit.Password)
    #     print('hide pass')


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

PyQt5 的一大优点是它会自动 为您将信号连接到方法。如果您的应用程序中有一个名为 <mybutton> 的按钮和一个名为 on_<mybutton>_clicked 的方法,loadUi 将自动连接。所以模式是

on_<widget_name>_<signal>

如果我们将此应用于您的问题,您应该将 show/hide 按钮设为切换按钮。在 Qt Designer 中,将可检查的 属性 设置为 True(或执行 btn_show_pwd.clicked.setChecked(True)

代码:

from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QPushButton, QLineEdit
import sys
#import pymysql
#pymysql.install_as_MySQLdb()

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self, maxWidth=None):
        super(MyWindow, self).__init__()
        uic.loadUi('test1.ui', self)

        self.line_password.setEchoMode(QLineEdit.Password)

    def on_btn_show_pwd_toggled(self, checked):
        if checked:
            self.line_password.setEchoMode(QLineEdit.Password)
        else:
            self.line_password.setEchoMode(QLineEdit.Normal)

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

另一种可能性是向 QLineEdit 添加一个可检查的 QAction 并连接到 toggled(或 triggered)信号。

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self, maxWidth=None):
        super(MyWindow, self).__init__()
        uic.loadUi('MainWindow.ui', self)

        icon = QtGui.QIcon('eye-icon.png')
        self.showPassAction = QtWidgets.QAction(icon, 'Show password', self)
        self.line_password.addAction(
            self.showPassAction, QtWidgets.QLineEdit.TrailingPosition)
        self.showPassAction.setCheckable(True)
        self.showPassAction.toggled.connect(self.showPassword)

    def showPassword(self, show):
        self.line_password.setEchoMode(
            QtWidgets.QLineEdit.Normal if show else QtWidgets.QLineEdit.Password)

如果你只想在按下鼠标时显示密码,那么不要连接到toggled信号,而是找到那个动作的子QToolButton并连接到pressedreleased 代替。在这种情况下,操作不需要是可检查的。

        self.line_password.addAction(
            self.showPassAction, QtWidgets.QLineEdit.TrailingPosition)
        showPassButton = self.line_password.findChild(QtWidgets.QAbstractButton)
        showPassButton.pressed.connect(lambda: self.showPassword(True))
        showPassButton.released.connect(lambda: self.showPassword(False))