• [转]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. }    
  • 相关阅读:
    Codeforces610b
    Codeforces597A
    Timus1014(贪心算法)
    一般贪心
    优先队列问题(此题来源哈尔滨理工大学VJ)
    POJ2551Dungeon Master
    LightOJ 1140: How Many Zeroes? (数位DP)
    HDU 2089:不要62(数位DP)
    HDU 4722:Good Numbers(数位DP)
    HDU 3709: Balanced Number (数位DP)
  • 原文地址:https://www.cnblogs.com/sky1991/p/2999122.html
Copyright © 2020-2023  润新知