[转]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. }    
posted @ 2013-04-04 11:03  sky1991  阅读(213)  评论(0编辑  收藏  举报