/** * @file PaiPushButton.cpp * @date 2012-1-31 */ #include #include #include #include #include #include #include "PaiPushButton.h" using namespace pai::gui; PaiPushButton::~PaiPushButton() { } PaiPushButton::PaiPushButton(QWidget *pParent) : QPushButton(pParent) { m_pPopupWidget = NULL; m_pPopupFrame = NULL; } PaiPushButton::PaiPushButton(const QString & text, QWidget *pParent) : QPushButton(text, pParent) { m_pPopupWidget = NULL; m_pPopupFrame = NULL; } PaiPushButton::PaiPushButton(const QIcon & icon, const QString & text, QWidget *pParent) : QPushButton(icon, text, pParent) { m_pPopupWidget = NULL; m_pPopupFrame = NULL; } void PaiPushButton::SetPopupWidget(QWidget *pPopupCenterWidget) { if((NULL != m_pPopupFrame) || (NULL == pPopupCenterWidget)) { return; } m_pPopupWidget = pPopupCenterWidget; m_pPopupFrame = new QWidget(this, Qt::Popup); QGridLayout *pLay = new QGridLayout(m_pPopupFrame); pLay->addWidget(pPopupCenterWidget, 0, 0, 1, 1); pLay->setContentsMargins(1, 1, 1, 1); m_pPopupFrame->resize(pPopupCenterWidget->width(), pPopupCenterWidget->height()); } void PaiPushButton::ClosePopupWidget() { m_pPopupFrame->hide(); } void PaiPushButton::mousePressEvent(QMouseEvent *pEvent) { if(NULL != m_pPopupFrame) { int popupFrameX = mapToGlobal(QPoint(0, 0)).x() + m_pPopupFrame->width(); QDesktopWidget *pWidget = QApplication::desktop(); QRect desktopRect = pWidget->screenGeometry(pWidget->primaryScreen()); if(popupFrameX > desktopRect.width()) { m_pPopupFrame->move(mapToGlobal(QPoint((width() - m_pPopupFrame->width()), height()))); } else { m_pPopupFrame->move(mapToGlobal(QPoint(0, height()))); } m_pPopupFrame->raise(); m_pPopupFrame->show(); } QPushButton::mousePressEvent(pEvent); } void PaiPushButton::mouseReleaseEvent(QMouseEvent *pEvent) { QPushButton::mouseReleaseEvent(pEvent); } void PaiPushButton::paintEvent(QPaintEvent*) { QStylePainter p(this); QStyleOptionButton option; initStyleOption(&option); if(m_pPopupFrame != NULL) { option.features |= QStyleOptionButton::HasMenu; } if(option.state & QStyle::State_HasFocus) { option.state = option.state ^ QStyle::State_HasFocus; } p.drawControl(QStyle::CE_PushButton, option); }