Qt 自定义提示框 右下角冒泡

网页右下角上经常会出现一些提示性的信息,B/S有的东西,C/S当然也可以有,就像QQ的消息提示一样! 实现一个类似的东西并不困难,只要想明白原理实现起来就很简单了! 实现原理: (1)显示:右下角缓慢弹出,定时器启动,逐渐改变位置即可,到达相应位置,停止计时器

(2)驻留:定时器启动,让界面停留一定的时间,相应的时间过后停止定时器

(3)退出:可以直接退出,也可以采用改变透明度的形式模糊退出

标题栏:
#include "message_title.h"
#include "setting.h"
MessageTitle::MessageTitle(QWidget *parent)
 : QWidget(parent)
{
  setFixedHeight(30);
  title_label = new QLabel();
  close_button = new PushButton();
  layout = new QHBoxLayout();  
 title_label->setObjectName(QString::fromUtf8("labelOne"));
  QFont title_font = title_label->font();
  title_font.setBold(true);
  title_label->setFont(title_font);
  close_button->loadPixmap("tipclose");
  close_button->setToolTip(tr("close"));
  layout->addWidget(title_label);
  layout->addStretch();
  layout->addWidget(close_button);
  layout->setMargin(0);
  setLayout(layout);
  connect(close_button, SIGNAL(clicked()), this, SIGNAL(myClose()));
}
void MessageTitle::paintEvent(QPaintEvent *)
{
  QLinearGradient linear(rect().topLeft(), rect().bottomRight());
  linear.setColorAt(0, QColor(55, 135, 215));
  linear.setColorAt(0.5, QColor(140, 120, 185));
  linear.setColorAt(1, QColor(55, 135, 215));
  QPainter painter(this);
  painter.setBrush(QBrush(linear));
  painter.setPen(Qt::NoPen);
  painter.drawRect(rect());
}
void MessageTitle::setTitleText(QString title)
{
  title_label->setText(title);
} 
弹出框界面:

#include "message_widget.h"

MessageWidget::MessageWidget(QWidget *parent)
 : QWidget(parent)
{
  setFixedSize(300, 180);
  setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
  message_title = new MessageTitle();
  content_label = new QLabel();
  icon_label = new QLabel();
  timer_show = new QTimer(this);
  timer_stay = new QTimer(this);
  timer_close = new QTimer(this);

  time_count = 0;
  transparent = 1.0;
  desktop_height = QApplication::desktop()->height();

  icon_label->setFixedSize(64, 64);

  content_label->setWordWrap(true);
 content_label->setAlignment(Qt::AlignTop);

  QVBoxLayout *v_layout = new QVBoxLayout();
  v_layout->addWidget(icon_label);
  v_layout->addStretch();

  QVBoxLayout *v_layout2 = new QVBoxLayout();
  QSpacerItem *spacerItem = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Minimum);
  v_layout2->addSpacerItem(spacerItem);
  v_layout2->addWidget(content_label);
 
  QHBoxLayout *h_layout = new QHBoxLayout();
  h_layout->addLayout(v_layout);
  h_layout->addLayout(v_layout2);
  QMargins margins = h_layout->contentsMargins();
  margins.setTop(20);
  margins.setLeft(10);
  margins.setRight(10);
  h_layout->setContentsMargins(margins);

  QVBoxLayout *main_layout = new QVBoxLayout();
  main_layout->setMargin(0);
  main_layout->addWidget(message_title);
  main_layout->addLayout(h_layout);
  setLayout(main_layout);

  connect(timer_show, SIGNAL(timeout()), this, SLOT(myMove()));
  connect(timer_stay, SIGNAL(timeout()), this, SLOT(myStay()));
  connect(timer_close, SIGNAL(timeout()), this, SLOT(myClose()));
  connect(message_title, SIGNAL(myClose()), this, SLOT(close()));
}

void MessageWidget::showMsg(QString title, QString content)
{
  QPixmap pixmap(":/icon/win");
  icon_label->setPixmap(pixmap);
  message_title->setTitleText(" " + title);
  content_label->setText(" " + content);
  this->showMessage();
}

void MessageWidget::paintEvent(QPaintEvent *)
{
  QBitmap bitmap(this->size());
  bitmap.fill(Qt::white);
  QPainter painter(this);
  painter.setBrush(QBrush(QColor(250, 240, 230)));
  painter.setPen(QPen(QBrush(QColor(55, 135, 215)), 6));
  painter.drawRoundedRect(bitmap.rect(), 5, 5);
  setMask(bitmap);
}
void MessageWidget::showMessage()
{
  time_count = 0;
  transparent = 1.0;
  desktop_height = QApplication::desktop()->height();
  timer_show->stop();
  timer_stay->stop();
  timer_close->stop();
  setWindowOpacity(1);
  QDesktopWidget *desktop = QApplication::desktop();
  desk_rect = desktop->availableGeometry();
  normal_point.setX(desk_rect.width() - rect().width());
  normal_point.setY(desk_rect.height() - rect().height());
  move(normal_point.x(), normal_point.y());
  showNormal();
  timer_show->start(5);
}

void MessageWidget::myMove()
{
  desktop_height--;
  move(normal_point.x(), desktop_height);
  if(desktop_height <= normal_point.y())
  {
    timer_show->stop();
    timer_stay->start(1000);
  }
}

void MessageWidget::myStay()
{
  time_count++;
  if(time_count >= 9)
  {
    timer_stay->stop();
    timer_close->start(200);
  }
}

void MessageWidget::myClose()
{
  transparent -= 0.1;
  if(transparent <= 0.0)
  {
    timer_close->stop();
    this->close();
  }

  else

  {
   setWindowOpacity(transparent);
 }   
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89667.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20230822 Windows上使用find_package引入OpenCV报错

报错信息 打开Cmake项目时&#xff0c;find_package 报错&#xff1a; Found OpenCV Windows Pack but it has no binaries compatible with yourconfiguration.You should manually point CMake variable OpenCV_DIR to your build of OpenCVlibrary.原因 大概率原项目是在 …

Systick滴答定时器

今天&#xff0c;对Systick滴答定时器进行资料的整理&#xff0c;这个定时器在程序中的作用就是提供延时函数。参考&#xff08;【STM32】Systick滴答定时器_一只大喵咪1201的博客-CSDN博客&#xff09; Systick滴答定时器的介绍 相关寄存器 寄存器CTRL 补充HCLK 寄存器LOAD…

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…

2023年高教社杯数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

[蓝帽杯 2022 初赛]domainhacker

打开流量包&#xff0c;追踪TCP流&#xff0c;看到一串url编码 放到瑞士军刀里面解密 最下面这一串会觉得像base64编码 删掉前面两个字符就可以base64解码 依次类推&#xff0c;提取到第13个流&#xff0c;得到一串编码其中里面有密码 导出http对象 发现最后有个1.rar文件 不出…

FANUC机器人加减速倍率指令ACC的使用方法说明

FANUC机器人加减速倍率指令ACC的使用方法说明 单位有一台FANUC机器人(型号:M-900iB 360kg),偶尔会在启动的瞬间会报SRVO-050碰撞检测报警,而事实上机器人并没有开始移动或和其他工件产生碰撞,一直查了很长时间,也没有查到具体的原因,也尝试过重新进行负载推算,但是偶尔…

macOS M1使用TensorFlow GPU加速

本人是在pycharm运行代码&#xff0c;安装了tensorflow版本2.13.0 先运行代码查看有没有使用GPU加速&#xff1a; import tensorflow as tf# Press the green button in the gutter to run the script. if __name__ __main__:physical_devices tf.config.list_physical_dev…

Electron 报gpu_process_host.cc(951)] GPU process launch faile错误

解决方法&#xff0c;在入口js文件中&#xff0c;添加如下代码: app.commandLine.appendSwitch(no-sandbox)

All In One!Meta发布SeamlessM4T,支持100种语言,35种语音、开源、在线体验!

多语言识别翻译的研究一直都是学术界研究的重点。目前全球有几千种语言&#xff0c;在全球化背景下不同语言人群之间的交流越来越密切&#xff0c;然而学习一门外语的成本是非常大的。前两年的研究主要集中在一对一、一对多的研究&#xff0c;然而当面对这么多的语言时&#xf…

MSTP多生成树协议(第二课)

MSTP负载均衡 实验 需求 1&#xff09;PC1属于 vlan 10 &#xff0c;IP地址为 192.168.10.1/24&#xff0c; 网关为 192.168.10.2542&#xff09;PC2属于 vlan 20 &#xff0c;IP地址为 192.168.20.1/24&#xff0c; 网关为 192.168.20.254**3&#xff09;确保PC1与PC2互通4…

leetcode 1035. 不相交的线

2023.8.25 本题可以转化为&#xff1a;求两数组的最长公共子序列。 进而可以用dp算法解决。 方法类似于这题最长公共子序列 。 代码如下&#xff1a; class Solution { public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {vector<…

[国产MCU]-W801开发实例-按键与GPIO输入

按键与GPIO输入 文章目录 按键与GPIO输入1、硬件准备2、软件准备3、驱动实现4、驱动测试在前面的文章中,我们成功点亮了LED,同时也知道W801的GPIO是可软件配置的。在这里,将详细介绍如何通过按键控制LED。 1、硬件准备 W801开发板一块微动开关一个10K电阻一个导线若干1uF电容…

情人节特别篇:用c++弹奏音乐“海阔天空”与“孤勇者”

W...Y的主页 &#x1f495; 代码库分享 &#x1f60a; 目录 孤勇者 海阔天空 今天是2023年8月22日七夕情人节&#xff0c;但是对我来说就是再普通不过的日子。我相信有很多人期待这一天的到来&#xff0c;和自己的对象出去享受快乐时光。但是我只有一个人独孤的度过短暂的时…

jdk 04 stream的collect方法

01.收集(collect) collect&#xff0c;收集&#xff0c;可以说是内容最繁多、功能最丰富的部分了。 从字面上去理解&#xff0c;就是把一个流收集起来&#xff0c;最终可以是收集成一个值也可以收集成一个新的集合。 collect主要依赖java.util.stream.Collectors类内置的静态方…

Java抽象类

Java中的抽象类&#xff08;Abstract Class&#xff09;是一种特殊类型的类&#xff0c;它无法被实例化&#xff0c;只能被用作其他类的基础。抽象类用于定义具有共同特征和行为的一组相关类的共同结构和方法。抽象类可以包含抽象方法&#xff08;没有具体实现的方法&#xff0…

常见前端面试之VUE面试题汇总二

4. slot 是什么&#xff1f;有什么作用&#xff1f;原理是什么&#xff1f; slot 又名插槽&#xff0c;是 Vue 的内容分发机制&#xff0c;组件内部的模板引擎使用 slot 元素作为承载分发内容的出口。插槽 slot 是子组件的一个模板 标签元素&#xff0c;而这一个标签元素是否显…

学习JAVA打卡第四十天

对象的字符串表示 在此类中我们讲过&#xff0c;所有的类都默认是java.lang包中object类的子类或间接子类。 Object类有一个public String toString&#xff08;&#xff09;方法,一个对象通过调用该方法可以获得该对象的字符串表示。一个对象调用toString法&#xff08;&…

U盘怎么加密?U盘加密方法有哪些?

U盘是我们生活和工作中最常用的移动储存设备&#xff0c;经常被用来存放各种重要数据&#xff0c;为了保证数据的安全&#xff0c;我们需要加密U盘。那么&#xff0c;U盘加密方法有哪些呢&#xff1f; U盘加密普通方法 如果你的U盘储存数据不多&#xff0c;并且对于加密的要求…

回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果…

数据结构入门 — 链表详解_双向链表

前言 数据结构入门 — 双向链表详解* 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 系列文章 第一篇&#xff1a;数据结构入门 — 链表详解_单链表…