Qt之密码框不可选中、复制、粘贴、无右键菜单等

简述

在做用户登录、修改密码的时候,往往会用到密码框,其中一些功能要求与普通的输入框不同,例如:不能选中、复制、粘贴、无右键菜单等功能,当然设置密码不可见是必须的!

下面介绍两种方式来实现相同的效果。

  • 简述
  • 效果
  • 基础部分
  • 事件过滤器
    • 接口说明
    • 实现方式
  • 事件重写
  • 源码下载

效果

基础部分

//设置无右键菜单
setContextMenuPolicy(Qt::NoContextMenu);

//设置无输入时提示信息
setPlaceholderText(QStringLiteral("请输入密码"));

//设置密码效果模式
setEchoMode(QLineEdit::Password);

//设置最大输入长度16位
setMaxLength(16);

enum QLineEdit::EchoMode

这个枚举值描述输入框如何显示内容。

常数 描述
QLineEdit::Normal 0 输入时,正常显示字符,默认值
QLineEdit::NoEcho 1 不显示任何信息,密码长度、信息需要保密时比较适用
QLineEdit::Password 2 显示平台相关的密码掩码字符,而非实际的字符输入
QLineEdit::PasswordEchoOnEdit 3 编辑时候显示字符,编辑结束后和QLineEdit::Password效果一样

事件过滤器

接口说明

首先看下接口说明:

void QObject::installEventFilter(QObject * filterObj)

为对象安装一个filterObj事件过滤器,例如:

monitoredObj->installEventFilter(filterObj);

事件过滤器对象接受发送到被观察者对象的所有事件,可以停止事件或将其转发到被观察者对象。事件过滤器对象通过eventFilter() 来接受事件,如果指定的事件被过滤则必须返回true,否则返回false。

如果一个对象安装多个事件过滤器,那么,最后安装的过滤器首先被激活。

警告:如果在eventFilter()函数中删除接收对象,一定要返回true。如果返回false,Qt给已删除的对象发送事件,程序会crash。

注意,过滤器对象必须和被观察者对象处于同一线程。如果过滤器对象在不同的线程,这个函数什么都不做。如果在调用这个函数之后,过滤器对象或被观察者对象被移动到不同的线程,事件过滤器将不会被调用,直到两个对象再处于相同的线程中。

实现方式

首先,需要判断被观察的对象,也就是这里的obj,我们观察的是密码框QLineEdit,所以先进行转换。

然后进行事件判断与转换:鼠标移动对应的事件类型为mouseMoveEvent,鼠标双击对应的事件类型为mouseDoubleClickEvent,全选、复制、粘贴对应的事件类型为keyPressEvent,当接收到这些事件时,需要被过滤掉,所以返回true。

注意:return QObject::eventFilter(obj, event)这句代码很关键,这里的意思是继续传递该事件到被观察者,由其本身调用相应的事件。

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

事件重写

这种方式可能是大多数人都能想到的,针对输入框重新实现(PasswordLineEdit继承于QLineEdit)。

如上,我们分析得出鼠标移动对应的事件类型为mouseMoveEvent,鼠标双击对应的事件类型为mouseDoubleClickEvent,全选、复制、粘贴对应的事件类型为keyPressEvent,那么我们重写相应的事件即可。

//屏蔽输入框全选、复制、粘贴功能
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);
}

源码下载

时间: 2025-01-26 19:13:37

Qt之密码框不可选中、复制、粘贴、无右键菜单等的相关文章

ppt2013中怎么复制粘贴无格式文本?

  PPT的功能强大,下面我们一起来看看如何粘贴无格式的文本. 1.打开Microsoft powerpoint 2003. 文档不能复制粘贴"> 2.复制需要的文字. 3.执行"编辑"-"选择性粘贴"命令.会弹出选择性粘贴的对话框. 4.在对话框中选择"作为"下面的"无格式文本"选项,再点击"确定"按钮. 5.单击确定之后就可以在PPT中看到无格式的文本了. 注意事项:不要忘记点击确定按钮

js复制粘贴事件,获取剪切板数据(未做兼容,只支持webkit

一个js复制和粘贴事件的demo,你可以在这里查看: <html>  <head>   <title>JS复制粘贴事件</title>  </head>  <body>   <input type="text" id="text" />   <input type="button" id="btn" value="复制"

如何实现复制粘贴功能?

问题描述 有一个程序的编辑框屏蔽了复制粘贴的快捷键.我想通过C#自动这个实现这个功能请问怎么直接将粘贴板的内容直接复制出来Clipboard.GetDataObject()这个就算了这个明显是获取内容不输出我的想法就是一键复制粘贴进行模拟按键不知道怎么做!或者说怎么去修改CTRV+V设置成别的求代码 解决方案 解决方案二:没人顶吗?解决方案三:为什么Clipboard.GetDataObject()不行?用它复制..再用Clipboard.GetText()不就得到复制的东西了吗?得到复制的东西

Flash实例:FLASH内部复制粘贴图形

图形 内部的复制粘贴 代码如下: import flash.display.BitmapData; var _bmp:BitmapData = new BitmapData(_mc._width, _mc._height); var paste_mc:MovieClip = this.createEmptyMovieClip("paste_mc", 2); /////////////// var _menu = new ContextMenu(); function copy_func

当前页禁止复制粘贴截屏代码小集

本文为大家详细介绍下禁止截屏,通过清除剪切板实现.禁止复制.禁止右键菜单.禁止网页另存为等等,感兴趣的朋友可以参考下哈,希望对大家有所帮助   复制代码 代码如下: <style>@media print{body{display:none}}</style> <%--禁止截屏,通过清除剪切板实现 Start--%> <script type="text/javascript"> function clearShearPlate() {

javascript 密码框防止用户粘贴和复制的实现代码

 本篇文章主要是对javascript 密码框防止用户粘贴和复制的实现代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 <input id="password" type="password" onpaste="return false" onselectstart="return false" />   onpaste="return false":防止粘贴   onselects

系统-复制内容后,双击文本框 会自动复制并粘贴

问题描述 复制内容后,双击文本框 会自动复制并粘贴 本人遇到一个奇怪的问题,就是在A文本框中选中内容选择复制,然后在B文本框中进行粘贴.如果B文本框单击一次,然后选择粘贴,可粘贴,如果双击B文本框,再选择粘贴,就会将B文本框中内容进行复制粘贴.如果此时在C文本框中单机选择粘贴,则会显示B文本框中的内容.不是键盘鼠标的问题,也不是软件的问题,因为除了world,在网页上也出现此问题.用起来特别麻烦,所以求哪个大神帮帮忙,谢谢啊 解决方案 你电脑上安装什么其它软件了么?找一个可以光盘上运行的系统,比

edittext-EditText长按弹出复制粘贴选项框设置位置

问题描述 EditText长按弹出复制粘贴选项框设置位置 长按EditText会弹出复制粘贴选项框,但是组件在最顶部导致选项框覆盖了组件本身, 怎么使弹出的选项框处于组件下方.试了下setCustomSelectionActionModeCallback 方法在onCreateActionMode中 et_search.setCustomSelectionActionModeCallback(new Callback() { @Override public boolean onCreateAc

VB实现屏蔽文本框右键菜单的复制、粘贴等功能的方法_vb

本文实例讲述了VB屏蔽文本框中的右键菜单.复制.粘贴等功能的实现方法.该功能就是禁止文本框的右键功能,造成点击鼠标右键无效.是非常常见的一类实用功能. 具体的功能模块代码如下: '========================================================== '| 模 块 名 | TextBoxDisableAbility '| 说 明 | 禁止文本框的功能 '=================================================