如果单击眼睛图标显示/隐藏密码(QPushButton)

2024-09-30 14:16:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在注册表和登录表单中创建一个函数,如果单击QLineEdit,则使用QLineEdit来显示和隐藏密码。我是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_())

表单密码隐藏/显示眼睛:
form password hide/show eye

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


Tags: fromimportself密码表单defshowsys
3条回答

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

on_<widget_name>_<signal>

如果我们将此应用于您的问题,您应该将“显示/隐藏”按钮设置为切换按钮。在Qt设计器中,将checkable属性设置为True(或dobtn_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_())

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

password field with embedded button

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

您可以创建单个函数并切换可见性,而不是创建两个单独的方法,如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_())

相关问题 更多 >

    热门问题