103 lines
2.5 KiB
C++
103 lines
2.5 KiB
C++
/**
|
|
* @file PaiPushButton.cpp
|
|
* @date 2012-1-31
|
|
*/
|
|
#include <QStyleOptionButton>
|
|
#include <QStylePainter>
|
|
#include <QGridLayout>
|
|
#include <QMouseEvent>
|
|
#include <QApplication>
|
|
#include <QDesktopWidget>
|
|
|
|
#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);
|
|
}
|