122 lines
2.5 KiB
C++
122 lines
2.5 KiB
C++
![]() |
#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);
|
|||
|
}
|
|||
|
}
|