歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> QT:窗口最小化時顯示一個小浮標

QT:窗口最小化時顯示一個小浮標

日期:2017/3/1 10:14:37   编辑:Linux編程

有些窗口在自身最小化時要在桌面上顯示一個小浮標,讓用戶利用這個小浮標進行各種操作(例如迅雷的懸浮窗一樣),我試著用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. }
Copyright © Linux教程網 All Rights Reserved