logplus/Workflow/WFWidget/src/PaiPushButton.cpp
2026-01-16 17:18:41 +08:00

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);
}