QT:不规则窗口的实现

主要思路:
1:将窗体设为Qt::FramelessWindowHint(去掉标题栏)。
2:用一幅有部分区域是透明的图片作为程序的界面,并将图片透明的地方设为穿透。

3:重载程序的鼠标事件。


运行时截图(浅绿色的是桌面背景)

QT:不规则窗口的实现_第1张图片


源代码:


[cpp] view plain copy print ?
  1. #include <QtGui>    
  2.   
  3. class IrregularWidget : public QWidget    
  4. {    
  5.     Q_OBJECT    
  6. public:    
  7.     IrregularWidget(QWidget *parent = 0);    
  8.   
  9. protected:    
  10.     void mousePressEvent(QMouseEvent *event);    
  11.     void mouseMoveEvent(QMouseEvent *event);    
  12.     void paintEvent(QPaintEvent *event);    
  13.     void enterEvent(QEvent *event);    
  14.     void leaveEvent(QEvent *event);    
  15.   
  16. private:    
  17.     QPoint m_CurrentPos;    
  18.     QPixmap m_Pixmap;    
  19. };    
  20.   
  21. IrregularWidget::IrregularWidget(QWidget *parent)    
  22. : QWidget(parent, Qt::FramelessWindowHint)    
  23. {    
  24.     setWindowTitle("Irregular widget");    
  25.     //加载一幅有部分区域是透明的图片作为程序的界面    
  26.     m_Pixmap.load("delete.png");    
  27.     resize( m_Pixmap.size() );    
  28.     //不规则窗口的关键,将图片透明的地方设为穿透    
  29.     setMask( m_Pixmap.mask() );    
  30. }    
  31.   
  32. void IrregularWidget::mousePressEvent(QMouseEvent *event)    
  33. {    
  34.     //按住左键可以托动窗口,按下右键关闭程序    
  35.     if(event->button() == Qt::LeftButton)    
  36.     {    
  37.         m_CurrentPos = event->globalPos() - frameGeometry().topLeft();    
  38.         event->accept();    
  39.     }    
  40.     else if(event->button() == Qt::RightButton)    
  41.         close();    
  42. }    
  43.   
  44. void IrregularWidget::mouseMoveEvent(QMouseEvent *event)    
  45. {    
  46.     if (event->buttons() && Qt::LeftButton)    
  47.     {    
  48.         move(event->globalPos() - m_CurrentPos);    
  49.         event->accept();    
  50.     }    
  51. }    
  52.   
  53. void IrregularWidget::paintEvent(QPaintEvent *event)    
  54. {    
  55.     QPainter painter(this);    
  56.     painter.drawPixmap(0, 0, m_Pixmap);    
  57. }    
  58.   
  59. void IrregularWidget::leaveEvent(QEvent *event)    
  60. {    
  61.     //鼠标离开窗口时是普通的指针    
  62.     setCursor(Qt::ArrowCursor);    
  63. }    
  64.   
  65. void IrregularWidget::enterEvent(QEvent *event)    
  66. {    
  67.     //鼠标留在窗口上时是一个手指    
  68.     setCursor(Qt::PointingHandCursor);    
  69. }    
  70.   
  71. #include "main.moc"    
  72.   
  73. int main(int argc, char *argv[])    
  74. {    
  75.     QApplication app(argc, argv);    
  76.     IrregularWidget *widget = new IrregularWidget;    
  77.     widget->show();    
  78.     return app.exec();    
  79. }   

你可能感兴趣的:(qt)