先上效果图

代码实现

带小三角的悬浮提示窗口

// tiplabel.h
#ifndef TIPLABEL_H
#define TIPLABEL_H/************************************** \brief 带有小三角的tip label* \author NiceBlueChai*************************************/
#include <QLabel>//Triangle tip label
// TODO: 添加属性支持样式表设置样式
// TODO: 支持通过enum选择上下左右四个方向的小三角
class TipLabel : public QLabel
{Q_OBJECT
public:TipLabel(const QString& text, QWidget *parent = nullptr);bool eventFilter(QObject*,QEvent*) override;QSize sizeHint() const override;void updatePos(const QPoint& pos);using CallBackType = std::function<QPoint ()>;void setCallBack( CallBackType updatePosCallBack);void setTopWindow(QWidget* w);protected:void paintEvent(QPaintEvent*) override;private:CallBackType updatePosCallBack;QWidget* top_widget{nullptr};
};#endif // TIPLABEL_H
// tiplabel.cpp
#include "tiplabel.h"
#include <QApplication>
#include <QMouseEvent>
#include <QPainter>
#include <QPolygon>namespace {const int kTriangleHeight = 8;
const int kTriangleWidth = 20;
const int kTriangleLeftMargin = 30;
}TipLabel::TipLabel(const QString &text, QWidget *parent):QLabel(parent, Qt::ToolTip | Qt::FramelessWindowHint | Qt::BypassGraphicsProxyWidget)
{setText(text);setAttribute(Qt::WA_TranslucentBackground, true);setAttribute(Qt::WA_TransparentForMouseEvents, true);qApp->installEventFilter(this);
}bool TipLabel::eventFilter(QObject *o, QEvent *e)
{if(o == parent()){switch(e->type()){case QEvent::WindowDeactivate:hide();default:break;}}if(top_widget  && this->updatePosCallBack && o == top_widget){if(e->type() == QEvent::Move) {updatePos(updatePosCallBack());}}return false;
}QSize TipLabel::sizeHint() const
{return QSize(120, 34);
}void TipLabel::updatePos(const QPoint &pos)
{move(pos- QPoint(kTriangleLeftMargin + kTriangleWidth/2, 0));
}void TipLabel::setCallBack(CallBackType updatePosCallBack)
{this->updatePosCallBack = updatePosCallBack;
}void TipLabel::setTopWindow(QWidget *w)
{top_widget = w;
}void TipLabel::paintEvent(QPaintEvent *)
{QPainter painter(this);QPolygon polygon_triangle, polygon;polygon_triangle << QPoint(kTriangleLeftMargin, kTriangleHeight)<< QPoint(kTriangleLeftMargin + kTriangleWidth/2, 0)<< QPoint(kTriangleWidth + kTriangleLeftMargin, kTriangleHeight)<<QPoint(width() - 1, kTriangleHeight)<< QPoint(width() -1, height() -1)<< QPoint(1, height() -1)<< QPoint(1, kTriangleHeight) <<QPoint(kTriangleLeftMargin, kTriangleHeight);QRectF text_rect = rect().adjusted(0, kTriangleHeight, -1, -1);painter.fillRect(rect(), Qt::transparent);painter.save();painter.setPen(Qt::NoPen);painter.setBrush(Qt::white);painter.drawPolygon(polygon_triangle);painter.drawRoundedRect(text_rect, 6.0, 5.0);painter.setRenderHint(QPainter::Antialiasing, true);painter.setPen(Qt::gray);painter.setBrush(Qt::NoBrush);painter.drawPolyline(polygon_triangle);painter.restore();QTextOption opt;opt.setAlignment(Qt::AlignCenter);painter.drawText(text_rect, text(), opt);
}

使用上面小窗口在Lineedit获得焦点时显示大写锁定已打开

// tiplabel-lineedit.h
#ifndef TIPLABELLINEEDIT_H
#define TIPLABELLINEEDIT_H#include <QLineEdit>class TipLabel;
class TipLabelLineedit : public QLineEdit
{Q_OBJECT
public:explicit TipLabelLineedit(QWidget *parent = nullptr);void setTopWindow(QWidget* w);void setTipVisible(bool v);virtual QPoint tipPos();// QWidget interface
protected:void resizeEvent(QResizeEvent *event) override;void focusInEvent(QFocusEvent* event) override;void focusOutEvent(QFocusEvent* event) override;void keyEvent(QKeyEvent* event) override;private:TipLabel* label;bool tip_visible{false};
};#endif // TIPLABELLINEEDIT_H
#include "tiplabel-lineedit.h"
#include "../IMLabel/tiplabel.h"
#include <QResizeEvent>
#include "gui-util.h"
using namespace IMUtils;TipLabelLineedit::TipLabelLineedit(QWidget *parent): QLineEdit{parent}, label(new TipLabel("大写锁定已打开", this))
{auto calback = [this]()->QPoint{return tipPos();};label->setCallBack(calback);
}void TipLabelLineedit::setTopWindow(QWidget *w)
{label->setTopWindow(w);
}void TipLabelLineedit::setTipVisible(bool v)
{tip_visible = v;
}QPoint TipLabelLineedit::tipPos()
{auto pos = mapToGlobal(QPoint(10, size().height()/2));return pos;
}void TipLabelLineedit::resizeEvent(QResizeEvent *event)
{auto pos = mapToGlobal(QPoint(6, event->size().height()/2));label->updatePos(pos);QLineEdit::resizeEvent(event);
}void TipLabelLineedit::focusInEvent(QFocusEvent *event)
{if(tip_visible && getCapsLockToggled()){label->showNormal();}QLineEdit::focusInEvent(event);
}void TipLabelLineedit::focusOutEvent(QFocusEvent *event)
{label->hide();QLineEdit::focusOutEvent(event);
}void TipLabelLineedit::keyPressEvent(QKeyEvent *event)
{if(tip_visible && getCapsLockToggled()){label->showNormal();}else {label->hide();}QLineEdit::keyPressEvent(event);
}

参考链接

  • https://stackoverflow.com/questions/2968336/qt-password-field-warn-about-caps-lock
  • https://blog.csdn.net/nicebluechai/article/details/119177699

Qt · 密码输入框检测并显示大写锁定键已打开相关推荐

  1. 发布一个jquery插件--在Web下输入密码时提示大写锁定键(2012-05-03 10:20最后修改)...

    功能介绍: 在Web下输入密码时提示大写锁定键,封装成jq插件方便有需要的同学! 使用: $("#txtPWD").capsLockTip(); 截图预览: 代码(2012-05- ...

  2. 惠普笔记本按开机键后电源灯亮的,但是屏幕一直是黑的,只有大写锁定键闪烁,闪3次一个循环,听得到风扇...

    现象: 惠普笔记本按开机键后电源灯亮的,但是屏幕一直是黑的,只有大写锁定键闪烁,闪3次一个循环,听得到风扇转动的声音,热风,cpu应该也在工作,请问是什么问题. 解决(我按照红色的作了,就可以了,真是 ...

  3. Mac中Caps Lock(大写锁定键)为Control键(Emacs解放小拇指.)

    ---->系统偏好设置---->键盘---->修饰键---->大写锁定键:Control

  4. Mac:使用大写锁定键切换输入法

    Mac:使用大写锁定键切换输入法 动机 大写锁定键是我的键盘上用的最少的键之一.说是之一,一是因为我的键盘上还有一个关机键使用频率和它有的一拼,二是由于其地理位置优越经常会被误按. 实际上,在Chro ...

  5. 使用Mac技巧:如何解决Mac大写锁定键失灵?

    我们在输入中文的时候可能不会频繁需要切换大小写输入法,但是英文则不同,小编在输入英文文章时偶尔会遇到Mac电脑的caps lock键突然不管用了,要按很多下才行,不知道大家有没有遇到过这个问题呢?今天 ...

  6. 电脑开机显示锁定计算机,电脑显示大写锁定打开怎么办

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 按电脑键盘Caps Lock大写锁定键即可关闭. 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进 ...

  7. 在JavaScript中判断键盘的大写锁定键(Caps Lock)是否打开(附扫描枪相关规则)

    1,在按钮中配置onkeypress <input name='test' onkeypress ="testCapsLock(event)" /> 2,在JavaSc ...

  8. 联想电脑切换大小写键盘CapsLK时,出现提示小图标,“显示或者关闭显示大写锁定”、“中英文切。

    解决方案: 计算机->管理->服务和应用程序->服务Lenovo Fn and function keys service

  9. 大写锁定怎么解除(笔记本大写锁定怎么解除)

    电脑大写锁定怎么解除 1.首先打开控制面板. 2.接下来在新出现的界面中,点击"时钟.语言和区域". 3.接下来在新出现的界面中,点击"区域和语言". 4.接下 ...

最新文章

  1. linux查看当前shell的方法
  2. 学学python(4):面向对象及类,模块
  3. 安装了vmware tools后,自动调整大小-自动适应客户机仍为灰色(终极解决方案)
  4. MySQL instr()函数
  5. 解决:Access denied for user ‘root’@‘localhost’(using password: YES)
  6. input只能输入数字_Python基础第一个案例:猜数字游戏,这个都写不出,那就放弃吧...
  7. 问题 B: 字符串的长度
  8. JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally分别代表什么意义? 在try块中可以抛 出异常吗?...
  9. Identityserver4配置证书
  10. java day21【缓冲流、转换流、序列化流】
  11. CentOS “libc.so.6: version ‘GLIBC_2.14‘ not found“解决方法,同理‘GLIBC_2.15‘ not found“
  12. 关于java中assert(断言)的使用讲解
  13. 什么是JBPM工作流
  14. cp正在写入文件导致文件内容不一致
  15. 程序员的系统桌面应该是这样的
  16. 2015年15+最佳的响应式HTML5网站模板
  17. easyui-linkbutton 链接类型的按钮
  18. fcpx插件:Stupid raisins show pop for Mac(20个专业设计徽标动画)
  19. Python中的setattr()和getattr()
  20. hyperledger/cello安装和使用

热门文章

  1. 一个帖子引爆流行?wappblog助阵
  2. Yahoo Programming Contest 2019 D-Ears
  3. STC89C52RC - 1 - 简述以及最小操作系统
  4. 苹果手机如何投屏到电视机?新手一看就懂教程
  5. 2022年第一篇C语言50行代码制作爱心电子相册
  6. 美国国防部(DoD)计划采用敏捷开发
  7. 算法 博弈论( 初级Nim游戏)
  8. [BZOJ]4180: 字符串计数 SAM+矩阵乘法+二分
  9. 游记#2019ZJOI自闭记
  10. 操作符( ˃᷄˶˶̫˶˂᷅ )