You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWATI/Include/iBase/iPlugin/MdiSubWindowEx.h

127 lines
4.6 KiB
C++

#pragma once
#include <QMdiSubWindow>
#include "IxDynObj.h"
#include "iPlugin_global.h"
#include <QWindowsStyle>
#include <QProxyStyle>
#include <QStyleOption>
#include <QPainter>
#include "iBase_global.h"
#include <QApplication>
#include <QMouseEvent>
class CustomStyle : public QProxyStyle
{
public:
CustomStyle(QStyle *baseStyle = 0) : QProxyStyle(baseStyle) {}
void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
{
if(control == QStyle::CC_TitleBar)
{
const QStyleOptionTitleBar* styleOpt = qstyleoption_cast<const QStyleOptionTitleBar*>(option);
if (styleOpt != nullptr)
{
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
QRect rectMin = subControlRect(QStyle::CC_TitleBar, styleOpt, widget->isMinimized() ? QStyle::SC_TitleBarNormalButton : QStyle::SC_TitleBarMinButton, widget);
QRect rectMax = subControlRect(QStyle::CC_TitleBar, styleOpt, widget->isMaximized() ? QStyle::SC_TitleBarNormalButton : QStyle::SC_TitleBarMaxButton, widget);
QRect rectClose = subControlRect(QStyle::CC_TitleBar, styleOpt, QStyle::SC_TitleBarCloseButton, widget);
QBrush brush(styleOpt->state & State_Active ? QColor("#C0DCF2") : QColor("#DEF0FE"));
painter->fillRect(styleOpt->rect, brush);
QRect rect = styleOpt->rect;
//由于高度变化
rectMin.setTop(0);rectMin.setHeight(rect.height());
rectMax.setTop(0);rectMax.setHeight(rect.height());
rectClose.setTop(0);rectClose.setHeight(rect.height());
QSize IconSize = QSize(rect.height(), rect.height());
// 关闭按钮
QPixmap pixIconClose = zxLoadIcon("Titlebar_Close").pixmap(IconSize);
drawButton(painter, rectClose, pixIconClose, IconSize);
// 最大化按钮
QPixmap pixIconMax = zxLoadIcon(widget->isMaximized() ? "Titlebar_Normal" : "Titlebar_Max").pixmap(IconSize);
drawButton(painter, rectMax, pixIconMax, IconSize);
// 最小化按钮
QPixmap pixIconMin = zxLoadIcon(widget->isMinimized() ? "Titlebar_Normal" : "Titlebar_Min").pixmap(IconSize);
drawButton(painter, rectMin, pixIconMin, IconSize);
float fSize = (float) IconSize.height() * 2 / 3;
// 图标和标题文本
QRectF iconRect(rect.left() + 2, rect.top(), IconSize.height(), IconSize.height());
QRectF rcIcon(iconRect.center().rx()-fSize/2, iconRect.center().ry() - fSize/2, fSize, fSize);
painter->drawPixmap(rcIcon.toRect(), styleOpt->icon.pixmap(QSize(16, 16)));
QRectF rcTitle(rcIcon.right() + fSize, rect.top(), rectMin.left() - (rcIcon.right() + fSize), IconSize.height());
painter->drawText(rcTitle, styleOpt->text, QTextOption(Qt::AlignLeft | Qt::AlignVCenter));
painter->restore();
return;
}
}
else
{
QProxyStyle::drawComplexControl(control, option, painter, widget);
}
}
void drawButton(QPainter *painter, const QRectF &buttonRect, const QPixmap &icon, const QSize size) const
{
//绘制位置计算取1/2
float fSize = (float) size.height() * 1 / 2;
QRectF rcIcon(buttonRect.center().rx()-fSize/2, buttonRect.center().ry() - fSize/2, fSize, fSize);
painter->drawPixmap(rcIcon.toRect(), icon);
}
};
// 主要重载其信号响应
class I_PLUGIN_EXPORT MdiSubWindowEx :
public QMdiSubWindow
{
Q_OBJECT
public:
MdiSubWindowEx(bool bNovelQss, QWidget* parent = 0);
~MdiSubWindowEx();
void setBindingObj(IxDynObj* p);
IxDynObj* getBindingObj();
protected:
bool eventFilter(QObject*, QEvent*);
void showEvent(QShowEvent *event);
void hideEvent(QHideEvent* event);
void changeEvent(QEvent* event);
void closeEvent(QCloseEvent* event);
void resizeEvent(QResizeEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
signals:
// b:返回的是,是否允许关闭
void sigConformClosing(bool& b);
// 一旦关闭后,通知刷新状态
void sigMdiClosed();
private:
IxDynObj* m_pBindingObj; //这是绑定的Obj对象
};
//Mdi中的子项
class I_PLUGIN_EXPORT SubMdiSubWindowEx :
public MdiSubWindowEx
{
Q_OBJECT
public:
SubMdiSubWindowEx(bool bNovelQss, QWidget* parent = 0);
~SubMdiSubWindowEx();
};