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

news2025/1/16 0:48:12

网页右下角上经常会出现一些提示性的信息,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);
 }   
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html实现页面切换、顶部标签栏(可删、可切换,点击左侧超链接出现标签栏)

一、在一个页面&#xff08;不跨页面&#xff09; 效果&#xff1a; 代码 <!DOCTYPE html> <html><head><style>/* 设置标签页外层容器样式 */.tab-container {width: 100%;background-color: #f1f1f1;overflow: hidden;}/* 设置标签页选项卡的样式…

OLED效果设计笔记1:显示横向滚动字幕

本文使用芯片&#xff1a;STM32 F103 C8T6 最小系统板 从这个笔记开始&#xff0c;学习一下OLED的一些显示动画效果的实现&#xff0c;尝试自己能够做出一些接近实际产品的界面切换&#xff0c;动画效果设计~ 文章提供源码&#xff0c;测试效果图&#xff0c;原理介绍&#x…

每日一题:leetcode 1267 统计参与通信的服务器

这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一台其他服务…

Python“牵手”搜款网(VVIC)商品列表数据,关键词搜索搜款网API接口数据,搜款网API接口申请指南

搜款网&#xff08;VVIC&#xff09;平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;搜款网API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问搜款网平台的数据&#xff0c;包括商品信息、店铺信息、物流…

Cesium 后台返回的图片如何在代码里生成路径

文章目录 需求分析解决 需求 Cesium 中给地球加皮肤&#xff0c;但是皮肤是后台接口返回的图片&#xff0c;是动态值 分析 我们平常所了解到的贴图&#xff0c;路径只能是静态目录下的图片&#xff0c;而去请求后台的图片时出现了跨域&#xff0c;所以这个方法不可行&#…

安全服务工程师-徐庆臣(黑客洗白者)

职位描述 负责安全服务项目中的实施部分&#xff0c;包括&#xff1a;漏洞扫描、渗透测试、安全基线检 查、代码审计、应急响应等&#xff1b; 爆发高危漏洞后时行漏洞的分析应急&#xff1b; 对公司安全产品的后端支持&#xff1b; 掌握专业文档编写技巧&#xff1b; 关注行业…

计算机网络(10) --- 高级IO

计算机网络&#xff08;9&#xff09; --- 数据链路层与MAC帧_哈里沃克的博客-CSDN博客数据链路层与MAC帧https://blog.csdn.net/m0_63488627/article/details/132178583?spm1001.2014.3001.5501 1.IO介绍 1.IO本质 1.如果数据没有出现&#xff0c;那么读取文件其实会被阻塞住…

Linux下的系统编程——系统调用(五)

前言&#xff1a; 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface,API)。系统调用就是应用程序同系统之间数据交互的桥梁。 open/close函数 1.open函数&#xff1a; &#xff08;1&#xff09;int open(char *pathname, int flags) …

【C/C++】继承中构造函数与析构函数执行的顺序

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

14.4K Star,一款外观漂亮、运行快速、动画细腻的开源免费UI组件库

之前给大家推荐了很多后台模版&#xff0c;有读者希望推荐一些跟通用的好看组件&#xff0c;毕竟出了后台还有很多其他场景嘛。所以&#xff0c;今天继续给大家推荐一个广受好评的UI组件库&#xff1a;NextUI 主要特性 NextUI的主要目标是简化开发流程&#xff0c;为增强的用户…

Docker file解析

文章目录 简介构建的三步骤Docker执行Dockerfile的大致流程DockerFile常用保留字指令创建第一个Dockerfile镜像的缓存特性 Docker file 解析 简介 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本&#xff0c;记录了镜像构…

PHP竞赛管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 竞赛管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88244066 二、功能介绍 后…

【校招VIP】前端校招考点之页面转换算法

考点介绍&#xff1a; 在地址映射过程中&#xff0c;若在页面中发现所要访问的页面不在内存中&#xff0c;则产生缺页中断。当发生缺页中断时&#xff0c;如果操作系统内存中没有空闲页面&#xff0c;则操作系统必须在内存选择一个页面将其移出内存&#xff0c;以便为即将调入的…

C++信息学奥赛1147:最高分数的学生姓名

#include <iostream> #include <string> using namespace std; int main() {int n;// 输入一个整数ncin>>n;cin.ignore();string arr;string str;int max0;int fen;// 循环读取n个评分和对应的字符串for(int i0;i<n;i){cin>>fen>>arr;if(fen&…

分布式事务(7):SpringCloud2.0整合LCN

目前LCN版本已经升级为4.0了,但是官方没有SpringCloud2.0的demo案例。 因为LCN本身是开源的,有些大神对LCN框架源码做修改,可以支持SpringCloud2.0版本。 下载地址:https://download.csdn.net/download/u013938578/88251904 1 下载LCN服务端源码 https://download.csdn.…

ubuntu22.04.1-live的vm虚拟机扩展磁盘

1、虚拟机分配硬盘100G&#xff0c;进系统df -h根目录只有50G 2、查看所有块设备 lsblk 3、 查看卷信息vgdisplay 4、在原有基础上增加49G lvextend -L 49G /dev/ubuntu-vg/ubuntu-lv 5、调整大小 resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

深入理解线性回归模型的评估与优化方法

文章目录 &#x1f340;引言&#x1f340;模型评估方法&#x1f340;均方误差&#xff08;MSE&#xff09;&#x1f340;均方根误差&#xff08;RMSE&#xff09;&#x1f340;绝对平均误差&#xff08;MAE&#xff09;&#x1f340;模型优化策略&#x1f340;特征工程&#x1…

百度开源2019新型冠状病毒RNA预测算法

为应对2019年新型冠状病毒&#xff08;2019-nCoV&#xff09;爆发&#xff0c;中国科技巨头百度开源了其RNA&#xff08;核糖核酸&#xff09;预测算法LinearFold。该工具可以显著加快病毒RNA二级结构的预测时间&#xff0c;为一线研究人员提供在危机时期更好地了解病毒和开发靶…

多线程学习之多线程的三种实现方式及应用

一、继承Thread类 1.1方法 方法名说明void run()在线程开启后&#xff0c;此方法将被调用执行void start()使此线程开始执行&#xff0c;Java虚拟机会调用run方法() run()方法和start()方法的区别&#xff1a; run()&#xff1a;封装线程执行的代码&#xff0c;直接调用&am…

PDF如何转ppt?PDF转ppt的方法

PDF是一种广泛应用于文档传输和存储的格式&#xff0c;然而&#xff0c;在某些情况下&#xff0c;我们可能需要将PDF文件转换为PPT&#xff0c;以便更加灵活地编辑和展示内容。那么&#xff0c;PDF如何转ppt呢?在本文中&#xff0c;我们将介绍几种常用的方法和工具&#xff0c…