【Qt】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);
}
源码下载
原文作者:一去丶二三里
作者博客:去作者博客空间
【Qt】Qt之密码框不可选中、复制、粘贴、无右键菜单等【转】的更多相关文章
- Qt之密码框不可全选、复制、粘贴无右键菜单等
转载---> http://blog.sina.com.cn/s/blog_a6fb6cc90101artk.html 在做用户登录界面的时候,往往会用到密码框,则其中的一些功能也要求与普通的输 ...
- Qt之密码框不可选中、复制、粘贴、无右键菜单等
简述 在做用户登录.修改密码的时候,往往会用到密码框,其中一些功能要求与普通的输入框不同,例如:不能选中.复制.粘贴.无右键菜单等功能,当然设置密码不可见是必须的! 下面介绍两种方式来实现相同的效果. ...
- Qt 密码框不可选中、复制、粘贴、无右键菜单等
在做用户登录.修改密码的时候,往往会用到密码框,其中一些功能要求与普通的输入框不同. 例如:不能选中.复制.粘贴.无右键菜单等功能,当然设置密码不可见是必须的! 一般的密码框:(默认 可以选中,复制, ...
- PyQt:自定义QLineEdit禁止选中复制粘贴
说明 自定义的QLineEdit,当输入文本之后,禁止选中复制粘贴等操作 实现方法 MyQLineEdit类继承了QLineEdit类,并重写QLineEdit类中的mouseMoveEvent方法和 ...
- Xshell 远程使用vim打开文件不能使用右键复制粘贴(右键显示可视)的问题
Xshell 远程使用vim打开文件不能使用右键复制粘贴(右键显示可视)的问题 Debian9.4系统不能再VIM打开文件界面不能使用右键复制粘贴 root@debian:~# vim /usr/sh ...
- Qt之国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)
简介 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮.QLineEdit.QSpinBox.QScrollBar中的右键菜单等.通常情况下,我们软件都不会是纯英文的,那么如何 ...
- js禁止页面复制 禁用页面右键菜单的代码
js实现禁止页面复制功能.禁用页面右键菜单等功能. <body oncontextmenu="return false">禁用网页右键菜单,但是仍然可以使用快捷键复制 ...
- 禁止页面复制功能 js禁止复制 禁用页面右键菜单
<body oncontextmenu="return false">禁用网页右键菜单,但是仍然可以使用快捷键复制. js代码禁用复制功能: <script t ...
- WPF密码框中禁止复制、粘贴
如题: " Margin="215,32,151,0" > <PasswordBox.CommandBindings> <CommandBindi ...
随机推荐
- LeetCode48 Rotate Image
题目: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwis ...
- IIS 之 托管管道模式
IIS 7.0 支持两种管道模式: (1)IIS 7.0 最新提供的集成管道模式(Integrated), (2)经典管道模式(Classic),经典管道模式是由先前版本的IIS提供的. 我们可以通过 ...
- 通过CAGradientLayer类实现色度差动画
#import "ViewController.h" @interface ViewController () { CAGradientLayer *_gradientLayer; ...
- 【Android 界面效果19】Android中shape的使用
Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结: 先看下面的代码: <shape> ...
- 21世纪C语言(影印版)
<21世纪C语言(影印版)> 基本信息 原书名:21st Century C 作者: Ben Klemens 出版社:东南大学出版社 ISBN:9787564142056 上架时间:201 ...
- UVA 113 Power of Cryptography (数学)
Power of Cryptography Background Current work in cryptography involves (among other things) large p ...
- 查看centos中的用户和用户组
用户列表文件:/etc/passwd 用户组列表文件:/etc/group 查看系统中有哪些用户:cut -d : -f 1 /etc/passwd查看可以登录系统的用户:cat /etc/passw ...
- hdu 4494 最小费用流
思路:这题我在下午重现的时候就用的费用流做,可是各种悲催的超时,只是我一开始的那种建图方式多了一个二分查找. 戏剧性的是,求距离的返回值写成int型了,CodeBlock编译器又没有警告,然后就WA啊 ...
- Wonderful Sentense
1.Sorry if I might sound arrogant or offensive. 2.Any further question? 3.How dare you! 4.Try it if ...
- 《JavaScript高级程序设计》笔记——关于继承
继承在JavaScript中是一种“奇葩”的存在,因为其本身并没有类(class)的概念(ES5),所以只能用其他方式(原型链.构造函数.对象实例)来模拟继承的行为.既然是模拟,那就应该是想办法实现继 ...