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

    http://blog.csdn.net/small_qch/article/details/7054750

  • 相关阅读:
    hashCode()相同,equals()也一定为true吗?
    什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题?
    LOJ114_k 大异或和_线性基
    BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数
    BZOJ_4184_shallot_线段树按时间分治维护线性基
    BZOJ_2844_albus就是要第一个出场_线性基
    BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论
    BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图
    BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组
    BZOJ_1532_[POI2005]Kos-Dicing_二分+网络流
  • 原文地址:https://www.cnblogs.com/findumars/p/4851271.html
Copyright © 2020-2023  润新知