歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

有些窗口在自身最小化時要在桌面上顯示一個小浮標,讓用戶利用這個小浮標進行各種操作(例如迅雷的懸浮窗一樣),我試著用QT實現一下這個功能。

PS:本來以為這個功能很簡單,卻搞了我兩個晚上,淚奔。。。

思路:

1:制作一個由一個小圖標組成的,可點擊,可拖動,背景透明的Widget

2:重載主窗口(在此例子中是QLabel)的changeEvent(詳情見代碼)

截圖:(淺綠色的部分是桌面背景)

主窗體:

小浮標:

代碼:

  1. #include <QtGui>   
  2. #include <Windows.h>   
  3.   
  4. //   
  5. class MinIconWidget : public QWidget      
  6. {      
  7.     Q_OBJECT      
  8. private:      
  9.     QPoint m_CurrentPos;      
  10.     QPixmap m_Pixmap;         
  11. protected:      
  12.     void mousePressEvent(QMouseEvent *event);      
  13.     void mouseMoveEvent(QMouseEvent *event);      
  14.     void paintEvent(QPaintEvent *event);      
  15.     void enterEvent(QEvent *event);      
  16.     void leaveEvent(QEvent *event);  
  17.     void mouseDoubleClickEvent(QMouseEvent *event);  
  18. public:      
  19.     MinIconWidget(QWidget *parent = 0);    
  20.     void SetPixmap(const QPixmap &pixmap);  
  21. signals:  
  22.     void DoubleClickedSignal();  
  23. };  
  24.   
  25. MinIconWidget::MinIconWidget(QWidget *parent)      
  26. : QWidget(parent)      
  27. {      
  28.     //將浮標Widget設置為:頂層窗口;無標題欄;工具條模式;背景透明;無輸入焦點   
  29.     setWindowFlags( Qt::FramelessWindowHint   
  30.         | Qt::WindowStaysOnTopHint | Qt::Tool );         
  31.     setAttribute(Qt::WA_TranslucentBackground, true);  
  32.     setFocusPolicy(Qt::NoFocus);  
  33. }      
  34.   
  35. void MinIconWidget::mousePressEvent(QMouseEvent *event)      
  36. {      
  37.     //按住左鍵移動可以拖動窗口       
  38.     if(event->button() == Qt::LeftButton)      
  39.     {  
  40.         m_CurrentPos = event->globalPos() - frameGeometry().topLeft();      
  41.         event->accept();      
  42.     }         
  43. }      
  44.   
  45. void MinIconWidget::mouseMoveEvent(QMouseEvent *event)      
  46. {      
  47.     if (event->buttons() && Qt::LeftButton)      
  48.     {      
  49.         move(event->globalPos() - m_CurrentPos);      
  50.         event->accept();      
  51.     }      
  52. }      
  53.   
  54. void MinIconWidget::paintEvent(QPaintEvent *event)      
  55. {      
  56.     QPainter painter(this);      
  57.     painter.drawPixmap(0, 0, m_Pixmap);      
  58. }      
  59.   
  60. void MinIconWidget::leaveEvent(QEvent *event)      
  61. {      
  62.     //鼠標離開窗口時是普通的指針       
  63.     setCursor(Qt::ArrowCursor);      
  64. }      
  65.   
  66. void MinIconWidget::enterEvent(QEvent *event)      
  67. {      
  68.     //鼠標留在窗口上時是一個手指       
  69.     setCursor(Qt::PointingHandCursor);      
  70. }      
  71.   
  72. void MinIconWidget::mouseDoubleClickEvent(QMouseEvent *event)  
  73. {  
  74.     emit DoubleClickedSignal();  
  75. }  
  76.   
  77. void MinIconWidget::SetPixmap(const QPixmap &pixmap)  
  78. {  
  79.     m_Pixmap = pixmap;  
  80.     update();  
  81. }  
  82.   
  83.   
  84. class MyLabel : public QLabel  
  85. {  
  86.     Q_OBJECT  
  87. private:  
  88.     MinIconWidget *m_minIcon;  
  89. protected:  
  90.     void changeEvent(QEvent *event);  
  91. public:  
  92.     MyLabel(QWidget *parent = 0);  
  93.     public slots:  
  94.         void ShowMainWindow();  
  95.         void HideMainWindow();  
  96. };   
  97.   
  98. MyLabel::MyLabel(QWidget *parent /* = 0 */)  
  99. : QLabel(parent)  
  100. {  
  101.   
  102.     m_minIcon = new MinIconWidget;  
  103.     m_minIcon->SetPixmap( QPixmap("delete.png") );  
  104.     setWindowFlags( Qt::WindowStaysOnTopHint );  
  105.     //雙擊浮動時,隱藏浮標,還原主窗口(這裡是一個LABEL)   
  106.     connect(m_minIcon, SIGNAL(DoubleClickedSignal()), this, SLOT(ShowMainWindow()));  
  107. }  
  108.   
  109. void MyLabel::changeEvent(QEvent *event)  
  110. {  
  111.     //重點,窗口最小化時最小化窗口(廢話),顯示浮標   
  112.     //窗口還原時,隱藏浮標,還原主窗口(這裡是一個LABEL)   
  113.     if(event->type()==QEvent::WindowStateChange)  
  114.     {  
  115.         //changeEvent會在窗口最小化之前調用,如果不加QTimer,   
  116.         //我們把窗口隱藏了,但是Qt還以為窗口正要最小化,這樣就會出錯   
  117.         if(windowState() & Qt::WindowMinimized)  
  118.             QTimer::singleShot(0, this, SLOT(HideMainWindow()));  
  119.         else if(windowState() & Qt::WindowNoState)  
  120.             QTimer::singleShot(0, this, SLOT(ShowMainWindow()));  
  121.     }  
  122.     QLabel::changeEvent(event);  
  123. }  
  124.   
  125. void MyLabel::ShowMainWindow()  
  126. {  
  127.     m_minIcon->hide();  
  128.     move( m_minIcon->pos() );  
  129.     show();  
  130.     setWindowState(Qt::WindowNoState);  
  131. }  
  132.   
  133. void MyLabel::HideMainWindow()  
  134. {  
  135.     hide();  
  136.     m_minIcon->move( pos() );  
  137.     m_minIcon->show();  
  138.     setWindowState(Qt::WindowMinimized);  
  139. }  
  140.   
  141.   
  142. #include "main.moc"   
  143.   
  144. int main(int argc, char **argv)  
  145. {  
  146.     QApplication app(argc, argv);  
  147.     MyLabel label;  
  148.     label.setStyleSheet("QLabel{font-size:30px;color:red;}");  
  149.     label.resize(400, 200);  
  150.     label.setText("This is a simple demo.");  
  151.     label.show();  
  152.     return app.exec();  
  153. }  
Copyright © Linux教程網 All Rights Reserved