有些窗口在自身最小化时要在桌面上显示一个小浮标,让用户利用这个小浮标进行各种操作(例如迅雷的悬浮窗一样),我试着用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. 折腾gnome3.4

    1.平埔式窗口管理器shellshape 刚开始用都是登录时默认为gnome classic,主要是希望有任务栏,但是为了在这种模式,gnome扩展都没有用了. 而我又在使用shellshape -- ...

  2. android gridview布局,实现长按某一个,所有项都显示删除的图标

    最近一直忙着项目开发,有段时间没有写博文了,今天想跟大家分享的是长按gridview中的某一项显示删除图标,此时点击某项便可删除,再长按取消删除图标. gridview的布局文件如下: <?xm ...

  3. 关于oracle动态视图v$datafile和v$datafile_header(转)

    v$datafile是从oracle的控制文件中获得的数据文件的信息v$datafile_header是从数据文件的头部在正常运行下,两者的检查点SCN值是一致的,但当datafile出现损坏时可以用 ...

  4. Eclipse servlet和jsp编写

    servlet: 在你新建的Application myapp/WEB-INF/classes/test目录下新建HelloWorld.java package test; import java.i ...

  5. Spring MVC对象转换说明

    在Spring MVC之前我们需要在Servlet里处理HttpServletRequest参数对象,但这个对象里的属性都是通用类型的对象(如字符串),处理起来很繁琐并且容易出错,而Spring MV ...

  6. Grid++Report 报表开发工具

      Grid++Report 报表开发工具   版本 更新日期 大小 下载 说明 Grid++Repoert6.0.0.6 2015/08/08 16.0M [下载] 锐浪报表工具最新版本,新增功能说 ...

  7. UESTC_秋实大哥打游戏 2015 UESTC Training for Data Structures<Problem H>

    H - 秋实大哥打游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  8. Java中的native方法

    博客引用地址:Java中的native方法 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地 ...

  9. android笔试题集2

    1.请谈一下Android系统的架构.答:Android系统采用了分层架构,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层. 2.谈谈android大众常用的五种布局.答 ...

  10. AJAX最简单的原理以及应用

    Ajax是创建快速动态网页的技术,通过后台与服务器少量的数据交互,是网页实现异步更新.也就是在不整个刷新页面的情况下,可以更新网页中的局部区域. 在原始web应用的模式中: 浏览器       以 h ...