zoukankan      html  css  js  c++  java
  • [转]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. }    
  • 相关阅读:
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    自考感悟,话谈备忘录模式
    [每日一题] OCP1z0-047 :2013-07-26 alter table set unused之后各种情况处理
    Java实现 蓝桥杯 算法提高 p1001
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 因式分解
    Java实现 蓝桥杯 算法提高 因式分解
  • 原文地址:https://www.cnblogs.com/sky1991/p/2999122.html
Copyright © 2011-2022 走看看