zoukankan      html  css  js  c++  java
  • Qt 密码框不可选中、复制、粘贴、无右键菜单等

    在做用户登录、修改密码的时候,往往会用到密码框,其中一些功能要求与普通的输入框不同。

    例如:不能选中、复制、粘贴、无右键菜单等功能,当然设置密码不可见是必须的!

    一般的密码框:(默认 可以选中,复制,粘贴,有右键菜单)

    QLineEdit *pCommonLineEdit = new QLineEdit(this);
    pCommonLineEdit->setPlaceholderText(QStringLiteral("密码由字母、数字、下划线组成,长度8-16位"));
    //QStringLieral是Qt5中新引入的一个用来从“字符串常量”创建QString对象的宏 pCommonLineEdit->setEchoMode(QLineEdit::Password);

    下面进行一些设置:不可选择,没有右键菜单

    1.可以进行事件重写去完成

    class PasswordLineEdit : public QLineEdit
    {
        Q_OBJECT
    
    public:
        explicit PasswordLineEdit(QWidget *parent = 0);
        ~PasswordLineEdit();
    
    protected:
        virtual void keyPressEvent(QKeyEvent *event);
        virtual void mouseMoveEvent(QMouseEvent *event);
        virtual void mouseDoubleClickEvent(QMouseEvent *event);
    };
    
    PasswordLineEdit::PasswordLineEdit(QWidget *parent)
        : QLineEdit(parent)
    {
        //设置无右键菜单
        setContextMenuPolicy(Qt::NoContextMenu);
        //设置无输入时密码提示
        setPlaceholderText(QStringLiteral("请输入密码"));
        //设置密码隐藏
        setEchoMode(QLineEdit::Password);
        //设置最大长度16位
        setMaxLength(16);
    }
    
    PasswordLineEdit::~PasswordLineEdit()
    {
    }
    
    //屏蔽输入框全选、复制、粘贴功能
    void PasswordLineEdit::keyPressEvent(QKeyEvent *event)
    {
        if(event->matches(QKeySequence::SelectAll)
                || event->matches(QKeySequence::Copy)
                || event->matches(QKeySequence::Paste))
        {
            return;
        }
    
        QLineEdit::keyPressEvent(event);
    }
    
    //鼠标位于密码框中时不可移动
    void PasswordLineEdit::mouseMoveEvent(QMouseEvent *event)
    {
        Q_UNUSED(event);
    }
    
    //鼠标位于密码框中时不可移动
    void PasswordLineEdit::mouseDoubleClickEvent(QMouseEvent *event)
    {
        Q_UNUSED(event);
    }
    

    2.通过事件过滤器去实现上述的功能

    QLineEdit *pFilterLineEdit = new QLineEdit(this);
    pFilterLineEdit->installEventFilter(new EventFilter(this));
    pFilterLineEdit->setEchoMode(QLineEdit::Password);
    pFilterLineEdit->setPlaceholderText(QStringLiteral("密码由字母、数字、下划线组成,长度8-16位"));
    pFilterLineEdit->setContextMenuPolicy(Qt::NoContextMenu);
    pFilterLineEdit->setMaxLength(16);
    
    class EventFilter : public QObject
    {
    public:
        explicit EventFilter(QObject *parent = 0);
        ~EventFilter();
    
    protected:
        virtual bool eventFilter(QObject *obj, QEvent *event);
    };
    
    EventFilter::EventFilter(QObject *parent)
        : QObject(parent)
    {
    
    }
    
    EventFilter::~EventFilter()
    {
    
    }
    
    bool EventFilter::eventFilter(QObject *obj, QEvent *event)
    {
        QLineEdit *pLineEdit = qobject_cast<QLineEdit *>(obj);
        if (pLineEdit != NULL)
        {
            switch (event->type())
            {
            case QEvent::MouseMove:
            case QEvent::MouseButtonDblClick:
                return true;
            case QEvent::KeyPress:
            {
                QKeyEvent *pKeyEvent = static_cast<QKeyEvent*>(event);
                if(pKeyEvent->matches(QKeySequence::SelectAll)
                        || pKeyEvent->matches(QKeySequence::Copy)
                        || pKeyEvent->matches(QKeySequence::Paste))
                {
                    return true;
                }
            }
            }
        }
        return QObject::eventFilter(obj, event);
    } 
  • 相关阅读:
    DButils工具类能够用来获取数据库连接向数据库插入更新删除对象
    Android 实现ActionBar定制
    查看CentOs6.5/7的系统版本号
    安装Was liberty之步骤
    在centOS上安装VNC
    SCP远程拷贝命令
    Was liberty资料总结
    罗杰斯:做你喜欢的工作,你会变成个有钱人
    【Java/csv】一个CSV文件解析类(转载)
    当你的才华还撑不起你的野心时,那你就应该静下心来学习。
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/5169617.html
Copyright © 2011-2022 走看看