QT:不规则窗口的实现

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

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


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



源代码:


  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. }   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值