instAdmin/Cpp/GisDes/SaRibbon/SARibbonBar/SARibbonStackedWidget.cpp

122 lines
2.5 KiB
C++
Raw Normal View History

2024-10-29 22:24:50 +08:00
#include "SARibbonStackedWidget.h"
#include <QEventLoop>
#include <QResizeEvent>
#include <QMouseEvent>
#include <QDebug>
#include <QApplication>
/**
* @brief The SARibbonStackedWidgetPrivate class
*/
class SARibbonStackedWidget::PrivateData
{
SA_RIBBON_DECLARE_PUBLIC(SARibbonStackedWidget)
public:
QEventLoop* eventLoop { nullptr };
public:
PrivateData(SARibbonStackedWidget* p) : q_ptr(p)
{
}
void init()
{
// Parent->setFocusPolicy(Qt::StrongFocus);
}
};
SARibbonStackedWidget::SARibbonStackedWidget(QWidget* parent)
: QStackedWidget(parent), d_ptr(new SARibbonStackedWidget::PrivateData(this))
{
d_ptr->init();
setNormalMode();
}
SARibbonStackedWidget::~SARibbonStackedWidget()
{
if (d_ptr->eventLoop) {
d_ptr->eventLoop->exit();
}
}
void SARibbonStackedWidget::setPopupMode()
{
setMouseTracking(true);
setWindowFlags(Qt::Popup | Qt::FramelessWindowHint);
setFrameShape(QFrame::Panel);
}
bool SARibbonStackedWidget::isPopupMode() const
{
return (windowFlags() & Qt::Popup);
}
void SARibbonStackedWidget::setNormalMode()
{
if (d_ptr->eventLoop) {
d_ptr->eventLoop->exit();
d_ptr->eventLoop = nullptr;
}
setMouseTracking(false);
setWindowFlags(Qt::Widget | Qt::FramelessWindowHint);
setFrameShape(QFrame::NoFrame);
}
bool SARibbonStackedWidget::isNormalMode() const
{
return (!isPopupMode());
}
void SARibbonStackedWidget::exec()
{
show();
if (!isPopupMode()) {
d_ptr->eventLoop = nullptr;
return;
}
QEventLoop event;
d_ptr->eventLoop = &event;
event.exec();
d_ptr->eventLoop = nullptr;
}
/**
* @brief tabbar的moveTab函数index
* @param from
* @param to
* @note widgetRemoved(int index)
*/
void SARibbonStackedWidget::moveWidget(int from, int to)
{
QWidget* w = widget(from);
removeWidget(w);
insertWidget(to, w);
}
void SARibbonStackedWidget::hideEvent(QHideEvent* e)
{
if (isPopupMode()) {
if (d_ptr->eventLoop) {
d_ptr->eventLoop->exit();
}
}
setFocus();
Q_EMIT hidWindow();
QStackedWidget::hideEvent(e);
}
void SARibbonStackedWidget::resizeEvent(QResizeEvent* e)
{
QStackedWidget::resizeEvent(e);
for (int i = 0; i < count(); ++i) {
if (i == currentIndex()) {
continue;
}
QEvent* layE = new QEvent(QEvent::LayoutRequest);
QApplication::postEvent(widget(i), layE);
}
}