先上效果图

代码实现

带小三角的悬浮提示窗口

// 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. 软件项目经理新手上路9 - 谁是你的敌人?
  2. 查看linux版本信息
  3. 计算机管理学科,计算机学院学科经费使用与管理细则(试行)
  4. BLE-NRF51822教程6-创建一个自己的服务
  5. 多视图几何总结——三角形法
  6. pythonscatter简书_python plotly 使用教程
  7. why SAP CRM object family error message is filtered out
  8. java jtable不可编辑_java – 使JTable单元不可编辑
  9. 文件查询之三:文件和目录的批量操作
  10. ios 绘制线框_iOS开发 给View添加指定位置的边框线
  11. VUE3 Router路由
  12. 解决 github clone慢
  13. SpringBoot入门 2
  14. POJ:3126-Prime Path
  15. 20155201 2016-2017-2 《Java程序设计》第五周学习总结
  16. ace自定义在线编辑器方法及提示
  17. 80个练手H5小游戏实例DEMO和源码
  18. 抢跑俞敏洪,教培人“玩命”直播
  19. 华信短信视频开源平台搭建攻略(之三完结易错篇)
  20. 韩国官员提议加强对加密货币监管的全球合作

热门文章

  1. mysql master status_mysql show master status为空值
  2. 怎样用计算机做ppt,怎样在家用电脑上制作幻灯片?
  3. 压力传感+数字开关混合传感集成人机交互面板
  4. 【看了10年前我为本单位写的此篇文章,感慨万分】此文章题目为:为关于“执行力”相关要素的方案设想
  5. Debian9开机自动执行脚本或程序
  6. 新年找工作的注意啦:一般通用面试内容
  7. python+opencv读取视频并设置可调整窗口大小
  8. 金蝶kis记账王新建套账的操作方法
  9. 弄底层基础的东西往往慢,枯燥,要慢慢磨
  10. Android 8 WiFi断流,小米8wifi断流怎么解决