一、效果 ![
二、弹窗主体部分 noticewidget
# include "../Include/NoticeWidget.h"
# include <QVBoxLayout>
# include <QPainter>
# include <QBitmap>
# include <QDesktopWidget>
# include <QDesktopServices>
# include <QApplication> CNoticeWidget :: CNoticeWidget ( QWidget* parent) : QWidget ( parent)
{ m_bMouseEnter = false ; setWindowFlags ( Qt:: FramelessWindowHint | Qt:: WindowStaysOnTopHint) ; setAttribute ( Qt:: WA_TranslucentBackground) ; m_pTitleLabel = new QLabel ( this ) ; m_pTitleLabel-> setAlignment ( Qt:: AlignTop | Qt:: AlignLeft) ; m_pTitleLabel-> setFixedSize ( 300 , 20 ) ; m_pTitleLabel-> setMargin ( 5 ) ; m_pMessageLabel = new QLabel ( this ) ; m_pMessageLabel-> setAlignment ( Qt:: AlignTop) ; m_pMessageLabel-> setWordWrap ( true ) ; m_pMessageLabel-> setFixedSize ( 300 , 100 ) ; QHBoxLayout* m_pTitleLayout = new QHBoxLayout; m_pTitleLayout-> setMargin ( 0 ) ; m_pTitleLayout-> addWidget ( m_pTitleLabel) ; m_pbtnlose = new QPushButton ( this ) ; m_pbtnlose-> setStyleSheet ( "QPushButton { color: white; border: none; }" ) ; connect ( m_pbtnlose, & QPushButton:: clicked, this , & CNoticeWidget:: close) ; m_pbtnlose-> setFixedSize ( 20 , 20 ) ; m_pbtnlose-> setIcon ( QIcon ( ":/Delete.png" ) ) ; m_pbtnlose-> setIconSize ( QSize ( 12 , 12 ) ) ; m_pTitleLayout-> addWidget ( m_pbtnlose) ; QVBoxLayout* m_pLayout = new QVBoxLayout; m_pLayout-> setMargin ( 0 ) ; m_pLayout-> addLayout ( m_pTitleLayout) ; m_pLayout-> addWidget ( m_pMessageLabel) ; m_pMessageLabel-> setMargin ( 5 ) ; setLayout ( m_pLayout) ; setFixedSize ( sizeHint ( ) . width ( ) , sizeHint ( ) . height ( ) ) ; m_pShowTimer = new QTimer ( this ) ; connect ( m_pShowTimer, & QTimer:: timeout, this , [ this ] ( ) { static int nBeginY = QApplication :: desktop ( ) -> height ( ) ; nBeginY-- ; move ( m_ptShowPos. x ( ) , nBeginY) ; if ( nBeginY <= m_ptShowPos. y ( ) ) { m_pShowTimer-> stop ( ) ; m_pStayTimer-> start ( 1000 ) ; } } ) ; m_pStayTimer = new QTimer ( this ) ; connect ( m_pStayTimer, & QTimer:: timeout, this , [ this ] ( ) { static int nTimeCount = 0 ; nTimeCount++ ; if ( nTimeCount >= 9 ) { m_pStayTimer-> stop ( ) ; m_pCloseTimer-> start ( 200 ) ; } } ) ; m_pCloseTimer = new QTimer ( this ) ; connect ( m_pCloseTimer, & QTimer:: timeout, this , [ this ] ( ) { static int nTran = 1.0 ; if ( m_bMouseEnter) { nTran = 1.0 ; setWindowOpacity ( nTran) ; return ; } nTran -= 0.1 ; if ( nTran <= 0.0 ) { m_pCloseTimer-> stop ( ) ; close ( ) ; } else { setWindowOpacity ( nTran) ; } } ) ;
} CNoticeWidget :: ~ CNoticeWidget ( )
{ } void CNoticeWidget :: SetMessage ( const QString& qstrTitle, const QString& qstrMessage)
{ m_pTitleLabel-> setText ( qstrTitle) ; m_pMessageLabel-> setText ( " " + qstrMessage) ; QDesktopWidget* pDeskTop = QApplication :: desktop ( ) ; QRect rcDeskTop = pDeskTop-> availableGeometry ( ) ; m_ptShowPos = QPoint ( rcDeskTop. width ( ) - width ( ) - 1 , rcDeskTop. height ( ) - height ( ) ) ; move ( m_ptShowPos. x ( ) , rcDeskTop. height ( ) - 1 ) ; show ( ) ; m_pShowTimer-> start ( 5 ) ;
} void CNoticeWidget :: paintEvent ( QPaintEvent* event)
{ QBitmap bitmap ( size ( ) ) ; bitmap. fill ( Qt:: white) ; QPainter painter ( this ) ; painter. setBrush ( QBrush ( QColor ( 250 , 240 , 230 ) ) ) ; painter. setPen ( QPen ( QBrush ( QColor ( 250 , 222 , 173 ) ) , 4 ) ) ; painter. drawRoundedRect ( bitmap. rect ( ) , 5 , 5 ) ; setMask ( bitmap) ; QWidget :: paintEvent ( event) ;
} void CNoticeWidget :: enterEvent ( QEvent* event)
{ m_bMouseEnter = true ; QWidget :: enterEvent ( event) ;
} void CNoticeWidget :: leaveEvent ( QEvent* event)
{ m_bMouseEnter = false ; QWidget :: leaveEvent ( event) ;
}