有些窗口在自身最小化时要在桌面上显示一个小浮标,让用户利用这个小浮标进行各种操作(例如迅雷的悬浮窗一样),我试着用QT实现一下这个功能。

PS:本来以为这个功能很简单,却搞了我两个晚上,泪奔。。。

思路:

1:制作一个由一个小图标组成的,可点击,可拖动,背景透明的Widget

2:重载主窗口(在此例子中是QLabel)的changeEvent(详情见代码)

截图:(浅绿色的部分是桌面背景)

主窗体:

小浮标:

代码:

  1. #include <QtGui>
  2. #include <Windows.h>
  3. //
  4. class MinIconWidget : public QWidget
  5. {
  6. Q_OBJECT
  7. private:
  8. QPoint m_CurrentPos;
  9. QPixmap m_Pixmap;
  10. protected:
  11. void mousePressEvent(QMouseEvent *event);
  12. void mouseMoveEvent(QMouseEvent *event);
  13. void paintEvent(QPaintEvent *event);
  14. void enterEvent(QEvent *event);
  15. void leaveEvent(QEvent *event);
  16. void mouseDoubleClickEvent(QMouseEvent *event);
  17. public:
  18. MinIconWidget(QWidget *parent = 0);
  19. void SetPixmap(const QPixmap &pixmap);
  20. signals:
  21. void DoubleClickedSignal();
  22. };
  23. MinIconWidget::MinIconWidget(QWidget *parent)
  24. : QWidget(parent)
  25. {
  26. //将浮标Widget设置为:顶层窗口;无标题栏;工具条模式;背景透明;无输入焦点
  27. setWindowFlags( Qt::FramelessWindowHint
  28. | Qt::WindowStaysOnTopHint | Qt::Tool );
  29. setAttribute(Qt::WA_TranslucentBackground, true);
  30. setFocusPolicy(Qt::NoFocus);
  31. }
  32. void MinIconWidget::mousePressEvent(QMouseEvent *event)
  33. {
  34. //按住左键移动可以拖动窗口
  35. if(event->button() == Qt::LeftButton)
  36. {
  37. m_CurrentPos = event->globalPos() - frameGeometry().topLeft();
  38. event->accept();
  39. }
  40. }
  41. void MinIconWidget::mouseMoveEvent(QMouseEvent *event)
  42. {
  43. if (event->buttons() && Qt::LeftButton)
  44. {
  45. move(event->globalPos() - m_CurrentPos);
  46. event->accept();
  47. }
  48. }
  49. void MinIconWidget::paintEvent(QPaintEvent *event)
  50. {
  51. QPainter painter(this);
  52. painter.drawPixmap(0, 0, m_Pixmap);
  53. }
  54. void MinIconWidget::leaveEvent(QEvent *event)
  55. {
  56. //鼠标离开窗口时是普通的指针
  57. setCursor(Qt::ArrowCursor);
  58. }
  59. void MinIconWidget::enterEvent(QEvent *event)
  60. {
  61. //鼠标留在窗口上时是一个手指
  62. setCursor(Qt::PointingHandCursor);
  63. }
  64. void MinIconWidget::mouseDoubleClickEvent(QMouseEvent *event)
  65. {
  66. emit DoubleClickedSignal();
  67. }
  68. void MinIconWidget::SetPixmap(const QPixmap &pixmap)
  69. {
  70. m_Pixmap = pixmap;
  71. update();
  72. }
  73. class MyLabel : public QLabel
  74. {
  75. Q_OBJECT
  76. private:
  77. MinIconWidget *m_minIcon;
  78. protected:
  79. void changeEvent(QEvent *event);
  80. public:
  81. MyLabel(QWidget *parent = 0);
  82. public slots:
  83. void ShowMainWindow();
  84. void HideMainWindow();
  85. };
  86. MyLabel::MyLabel(QWidget *parent /* = 0 */)
  87. : QLabel(parent)
  88. {
  89. m_minIcon = new MinIconWidget;
  90. m_minIcon->SetPixmap( QPixmap("delete.png") );
  91. setWindowFlags( Qt::WindowStaysOnTopHint );
  92. //双击浮动时,隐藏浮标,还原主窗口(这里是一个LABEL)
  93. connect(m_minIcon, SIGNAL(DoubleClickedSignal()), this, SLOT(ShowMainWindow()));
  94. }
  95. void MyLabel::changeEvent(QEvent *event)
  96. {
  97. //重点,窗口最小化时最小化窗口(废话),显示浮标
  98. //窗口还原时,隐藏浮标,还原主窗口(这里是一个LABEL)
  99. if(event->type()==QEvent::WindowStateChange)
  100. {
  101. //changeEvent会在窗口最小化之前调用,如果不加QTimer,
  102. //我们把窗口隐藏了,但是Qt还以为窗口正要最小化,这样就会出错
  103. if(windowState() & Qt::WindowMinimized)
  104. QTimer::singleShot(0, this, SLOT(HideMainWindow()));
  105. else if(windowState() & Qt::WindowNoState)
  106. QTimer::singleShot(0, this, SLOT(ShowMainWindow()));
  107. }
  108. QLabel::changeEvent(event);
  109. }
  110. void MyLabel::ShowMainWindow()
  111. {
  112. m_minIcon->hide();
  113. move( m_minIcon->pos() );
  114. show();
  115. setWindowState(Qt::WindowNoState);
  116. }
  117. void MyLabel::HideMainWindow()
  118. {
  119. hide();
  120. m_minIcon->move( pos() );
  121. m_minIcon->show();
  122. setWindowState(Qt::WindowMinimized);
  123. }
  124. #include "main.moc"
  125. int main(int argc, char **argv)
  126. {
  127. QApplication app(argc, argv);
  128. MyLabel label;
  129. label.setStyleSheet("QLabel{font-size:30px;color:red;}");
  130. label.resize(400, 200);
  131. label.setText("This is a simple demo.");
  132. label.show();
  133. return app.exec();
  134. }

http://blog.csdn.net/small_qch/article/details/7761139

QT:窗口最小化时显示一个小浮标的更多相关文章

  1. qt窗口最小化之后无法打开

    转自: https://blog.csdn.net/qiangzi4646/article/details/79743604 http://www.cnblogs.com/lingdhox/p/331 ...

  2. delphi代码实现窗口最小化,最大化,关闭消息发送

      分类: 代码实现窗口最小化,最大化,关闭 var hwnd: hwnd;//句柄 PostMessage(hwnd,WM_SYSCOMMAND, SC_MINIMIZE,0); //最小化Post ...

  3. WinForm 之 窗口最小化到托盘及右键图标显示菜单

    Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下角,则需要给Form添加一个NotifyIcon控件. ...

  4. C# 开机自启动和最小化托盘显示

    C# 开机自启动和最小化托盘显示 一.      C# 开机自启动 C# 开机自启动,这个功能是大多数服务型软件很常用一个功能,但是这个功能确是不 太好做,花了两天想对策.不过最终呢,结果还是很满意的 ...

  5. Winform 最小化双击显示,最小化右键退出。退出

    WinForm 之 窗口最小化到托盘及右键图标显示菜单 Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下 ...

  6. C# WinForm窗口最小化到系统托盘

    * C# WinForm窗口最小化到系统托盘http://hi.baidu.com/kfxtgtqyapouyze/item/8ccfdcd5a174a7312a35c7c3 主要功能:(1).程序启 ...

  7. windows vbs启动多个应用程序并使程序最小化(显示桌面)

      windows vbs启动多个应用程序并使程序最小化(显示桌面) CreationTime--2018年7月26日11点18分 Author:Marydon 1.应用场景 每天开机后,都需要打开平 ...

  8. NSIS检测到窗口最小化闪烁提示

    #检测到窗口为最小化时闪烁提示 !include nsDialogs.nsh #编写:水晶石 Name "IsIconic Example" OutFile "IsIco ...

  9. 转 原生js canvas实现苹果电脑mac OS窗口最小化效果

    http://www.17sucai.com/pins/demo-show?id=2459 http://www.17sucai.com/pins/demo-show?id=2458  很多资料 ,前 ...

随机推荐

  1. [TYVJ] P1049 最长不下降子序列

    最长不下降子序列 描述 Description 求最长不下降子序列的长度   输入格式 InputFormat 第一行为n,表示n个数第二行n个数   输出格式 OutputFormat 最长不下降子 ...

  2. error: ‘shared_ptr’ in namespace ‘std’ does not name a type

    用G++编译项目的时候发生标题上的错误,原因是,这是c++ 11标准的.在给g++传递命令行的时候加上-std=c++0x就行了. 还需要在源码中#include<memory> 我的cm ...

  3. struct内存对齐

    内存对齐其实是为了在程序运行的时候更快的查找内存而做的一种编译器优化. 我们先看这样一个例子: #include <iostream> using namespace std; struc ...

  4. UVA 1599 Ideal Path(bfs1+bfs2,双向bfs)

    给一个n个点m条边(<=n<=,<=m<=)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小.一对 ...

  5. Unity 关于属性的get/set

    学习Unity的可能多数是C#转过来的, 一进来的时候你会发现Unity编写代码,在一些视频或文章中.基本都没有用过get/set使用, 多数是public string name;这样写的公开字段, ...

  6. java面试题集2

    JAVA面试题-CORE JAVA部分          1.  在main(String[] args)方法内是否可以调用一个非静态方法? 答案:不能 2.  同一个文件里是否可以有两个public ...

  7. LED音乐频谱之输出数据处理

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38023539 一.PWM调节 1.初始化 void DACInit() { C ...

  8. 第一个MyBatis程序

    最近研究了一些MyBatis技术,虽然工作中还未用到,但是觉得了解一下也是不错的.这里记录了第一个简单的Demo程序,防止自己忘记. 第一步需要配置Mybatis-config.xml文件.注意:这里 ...

  9. 远程调试weinre的使用

    一.用途 *鉴于在浏览器调试移动端页面无法准确反映移动端实际情况并无法高效调试,故常常使用远程调试工具通过电脑连接手机进行调试,常用远程调试方式: 1.chrome连接安卓机远程调试 2.Mac连接苹 ...

  10. 六步实现Spring.NET 与 NHibernate 的整合

    最近刚完成一个项目,其中对数据库的架构用到的是Spring.NET 与 NHibernate相结合的产物.对于这两项技术,我自己也不是太熟悉,不过好在网上有很多关于这方面的介绍文档,在这里就不多说了. ...