QT:窗口最小化时显示一个小浮标
有些窗口在自身最小化时要在桌面上显示一个小浮标,让用户利用这个小浮标进行各种操作(例如迅雷的悬浮窗一样),我试着用QT实现一下这个功能。
PS:本来以为这个功能很简单,却搞了我两个晚上,泪奔。。。
思路:
1:制作一个由一个小图标组成的,可点击,可拖动,背景透明的Widget
2:重载主窗口(在此例子中是QLabel)的changeEvent(详情见代码)
截图:(浅绿色的部分是桌面背景)
主窗体:

小浮标:

代码:
- #include <QtGui>
- #include <Windows.h>
- //
- class MinIconWidget : public QWidget
- {
- Q_OBJECT
- private:
- QPoint m_CurrentPos;
- QPixmap m_Pixmap;
- protected:
- void mousePressEvent(QMouseEvent *event);
- void mouseMoveEvent(QMouseEvent *event);
- void paintEvent(QPaintEvent *event);
- void enterEvent(QEvent *event);
- void leaveEvent(QEvent *event);
- void mouseDoubleClickEvent(QMouseEvent *event);
- public:
- MinIconWidget(QWidget *parent = 0);
- void SetPixmap(const QPixmap &pixmap);
- signals:
- void DoubleClickedSignal();
- };
- MinIconWidget::MinIconWidget(QWidget *parent)
- : QWidget(parent)
- {
- //将浮标Widget设置为:顶层窗口;无标题栏;工具条模式;背景透明;无输入焦点
- setWindowFlags( Qt::FramelessWindowHint
- | Qt::WindowStaysOnTopHint | Qt::Tool );
- setAttribute(Qt::WA_TranslucentBackground, true);
- setFocusPolicy(Qt::NoFocus);
- }
- void MinIconWidget::mousePressEvent(QMouseEvent *event)
- {
- //按住左键移动可以拖动窗口
- if(event->button() == Qt::LeftButton)
- {
- m_CurrentPos = event->globalPos() - frameGeometry().topLeft();
- event->accept();
- }
- }
- void MinIconWidget::mouseMoveEvent(QMouseEvent *event)
- {
- if (event->buttons() && Qt::LeftButton)
- {
- move(event->globalPos() - m_CurrentPos);
- event->accept();
- }
- }
- void MinIconWidget::paintEvent(QPaintEvent *event)
- {
- QPainter painter(this);
- painter.drawPixmap(0, 0, m_Pixmap);
- }
- void MinIconWidget::leaveEvent(QEvent *event)
- {
- //鼠标离开窗口时是普通的指针
- setCursor(Qt::ArrowCursor);
- }
- void MinIconWidget::enterEvent(QEvent *event)
- {
- //鼠标留在窗口上时是一个手指
- setCursor(Qt::PointingHandCursor);
- }
- void MinIconWidget::mouseDoubleClickEvent(QMouseEvent *event)
- {
- emit DoubleClickedSignal();
- }
- void MinIconWidget::SetPixmap(const QPixmap &pixmap)
- {
- m_Pixmap = pixmap;
- update();
- }
- class MyLabel : public QLabel
- {
- Q_OBJECT
- private:
- MinIconWidget *m_minIcon;
- protected:
- void changeEvent(QEvent *event);
- public:
- MyLabel(QWidget *parent = 0);
- public slots:
- void ShowMainWindow();
- void HideMainWindow();
- };
- MyLabel::MyLabel(QWidget *parent /* = 0 */)
- : QLabel(parent)
- {
- m_minIcon = new MinIconWidget;
- m_minIcon->SetPixmap( QPixmap("delete.png") );
- setWindowFlags( Qt::WindowStaysOnTopHint );
- //双击浮动时,隐藏浮标,还原主窗口(这里是一个LABEL)
- connect(m_minIcon, SIGNAL(DoubleClickedSignal()), this, SLOT(ShowMainWindow()));
- }
- void MyLabel::changeEvent(QEvent *event)
- {
- //重点,窗口最小化时最小化窗口(废话),显示浮标
- //窗口还原时,隐藏浮标,还原主窗口(这里是一个LABEL)
- if(event->type()==QEvent::WindowStateChange)
- {
- //changeEvent会在窗口最小化之前调用,如果不加QTimer,
- //我们把窗口隐藏了,但是Qt还以为窗口正要最小化,这样就会出错
- if(windowState() & Qt::WindowMinimized)
- QTimer::singleShot(0, this, SLOT(HideMainWindow()));
- else if(windowState() & Qt::WindowNoState)
- QTimer::singleShot(0, this, SLOT(ShowMainWindow()));
- }
- QLabel::changeEvent(event);
- }
- void MyLabel::ShowMainWindow()
- {
- m_minIcon->hide();
- move( m_minIcon->pos() );
- show();
- setWindowState(Qt::WindowNoState);
- }
- void MyLabel::HideMainWindow()
- {
- hide();
- m_minIcon->move( pos() );
- m_minIcon->show();
- setWindowState(Qt::WindowMinimized);
- }
- #include "main.moc"
- int main(int argc, char **argv)
- {
- QApplication app(argc, argv);
- MyLabel label;
- label.setStyleSheet("QLabel{font-size:30px;color:red;}");
- label.resize(400, 200);
- label.setText("This is a simple demo.");
- label.show();
- return app.exec();
- }
http://blog.csdn.net/small_qch/article/details/7761139
QT:窗口最小化时显示一个小浮标的更多相关文章
- qt窗口最小化之后无法打开
转自: https://blog.csdn.net/qiangzi4646/article/details/79743604 http://www.cnblogs.com/lingdhox/p/331 ...
- delphi代码实现窗口最小化,最大化,关闭消息发送
分类: 代码实现窗口最小化,最大化,关闭 var hwnd: hwnd;//句柄 PostMessage(hwnd,WM_SYSCOMMAND, SC_MINIMIZE,0); //最小化Post ...
- WinForm 之 窗口最小化到托盘及右键图标显示菜单
Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下角,则需要给Form添加一个NotifyIcon控件. ...
- C# 开机自启动和最小化托盘显示
C# 开机自启动和最小化托盘显示 一. C# 开机自启动 C# 开机自启动,这个功能是大多数服务型软件很常用一个功能,但是这个功能确是不 太好做,花了两天想对策.不过最终呢,结果还是很满意的 ...
- Winform 最小化双击显示,最小化右键退出。退出
WinForm 之 窗口最小化到托盘及右键图标显示菜单 Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下 ...
- C# WinForm窗口最小化到系统托盘
* C# WinForm窗口最小化到系统托盘http://hi.baidu.com/kfxtgtqyapouyze/item/8ccfdcd5a174a7312a35c7c3 主要功能:(1).程序启 ...
- windows vbs启动多个应用程序并使程序最小化(显示桌面)
windows vbs启动多个应用程序并使程序最小化(显示桌面) CreationTime--2018年7月26日11点18分 Author:Marydon 1.应用场景 每天开机后,都需要打开平 ...
- NSIS检测到窗口最小化闪烁提示
#检测到窗口为最小化时闪烁提示 !include nsDialogs.nsh #编写:水晶石 Name "IsIconic Example" OutFile "IsIco ...
- 转 原生js canvas实现苹果电脑mac OS窗口最小化效果
http://www.17sucai.com/pins/demo-show?id=2459 http://www.17sucai.com/pins/demo-show?id=2458 很多资料 ,前 ...
随机推荐
- Linux系统维护修复模式
基于PXE方式的Linux系统维护工具箱 在安装RedHat Linux系统的过程中,我们知道可以通过PXE方式进行安装,从而解决了无光驱或无安装介质(光盘)来安装操作系统.但是当系统由于某种 ...
- 《Java web 开发实战经典》读书笔记
去年年末,也就是大四上学期快要结束的时候,当时保研的事情确定了下来,终于有了一些空闲的时间可以学点实用的技术. 之前做数据库课程设计的时候,也接触过java web的知识,当时做了一个卖二手书籍的网站 ...
- Impala 3、Impala、Hbase整合
Impala可以通过Hive外部表方式和HBase进行整合,步骤如下: • 步骤1:创建hbase 表,向表中添加数据 create 'test_info', 'info' put 'test_inf ...
- Java程序员面试题集(86-115)
摘 要:下面的内容包括Struts 2和Hibernate的常见面试题,虽然Struts 2在2013年6月曝出高危漏洞后已经显得江河日下,而Spring MVC的异军突起更加加速了Struts 2的 ...
- linux配置yum源
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...
- 【贪心】【uva11520】 Fill the Square
填充正方形(Fill the Square, UVa 11520) 在一个n×n网格中填了一些大写字母,你的任务是把剩下的格子中也填满大写字母,使得任意两个相邻格子(即有公共边的格子)中的字母不同.如 ...
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...
- tomcat-maven-plugin 插件使用
配置 在pom.xm 加入以下xml. <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId&g ...
- javax inect
Spring 3 and JSR-330 @Inject and @Named example By mkyong | September 16, 2012 | Viewed : 86,399 tim ...
- Illustrated C#学习笔记(一)
迄今为止最容易看懂的一本C#入门图书,的确是,很不错的一本书,继续读下去,并做好相关笔记吧. Chapter 1 C#和.NET框架 主要讲述了一些.NET框架下的一些不明觉厉的名词如CLR,CLI. ...