From b65863da660a4e6831e019eb58f31e3276b3a110 Mon Sep 17 00:00:00 2001 From: zcy <290198252@qq.com> Date: Wed, 19 Jan 2022 00:26:45 +0800 Subject: [PATCH] no message --- Qss.cpp | 33 ++++++++++++++++---- Qss.h | 96 +++++---------------------------------------------------- 2 files changed, 34 insertions(+), 95 deletions(-) diff --git a/Qss.cpp b/Qss.cpp index c8dcf54..f9e3efb 100644 --- a/Qss.cpp +++ b/Qss.cpp @@ -28,6 +28,20 @@ #define QSSDIALOG_SHADOW_WIDTH 12 #define QSSDIALOG_BODER_WIDTH 0 +static void rangeObjectList(QObject*obj,int indent){ + QObjectList child = obj->children(); + QString tmp(""); + for(int i = 0;i < indent;i++) + tmp +=" "; + + for(int i = 0;i < child.size();i++){ + qDebug()<objectName() + " " + child.at(i)->metaObject()->className(); + if(child.at(i)->children().size() > 0){ + rangeObjectList(child.at(i),indent + 1); + } + } +} + QssTtitleBar::QssTtitleBar(QWidget *parent , QTitleBar_Type type/* = QTitleBar_Type_Window*/) : QWidget(parent), @@ -159,8 +173,8 @@ void QssTtitleBar::mouseMoveEvent( QMouseEvent * ev ) return; QPoint globalPt = ev->globalPos(); - QPoint movePt = globalPt - m_pressedPos;//FrameglobalPos - parentWidget()->move(movePt);//globalPos + QPoint movePt = globalPt - m_pressedPos; + parentWidget()->move(movePt); QssMainWindow *parent = static_cast(parentWidget()); if(nullptr != parent){ parent->DetectDpiChange(); @@ -256,7 +270,8 @@ void QssMainWindow::DpiChange(qreal dpi) QssMainWindow::QssMainWindow(QWidget *parent/* = 0*/, Qt::WindowFlags flags/* = 0*/,float scale) : QMainWindow(parent, flags), m_mousePressedInBoundy(false), - m_bLeftPress(false) + m_bLeftPress(false), + m_dpi_ratio(1.0) { QEvent::registerEventType(); m_rcValid = QApplication::desktop()->availableGeometry(); @@ -298,13 +313,13 @@ QssMainWindow::QssMainWindow(QWidget *parent/* = 0*/, Qt::WindowFlags flags/* = mShadowMask->hide(); int screenNum = qApp->desktop()->screenNumber(this); - qDebug()<<"current screen number is "<screens().at(screenNum); if(nullptr != mCurrentScreen){ connect(mCurrentScreen, SIGNAL(physicalDotsPerInchChanged(qreal)), this,SLOT(DpiChange(qreal))); } + rangeObjectList(this,0); return; } @@ -554,6 +569,13 @@ void QssMainWindow::onMouseReleaseEvent( QMouseEvent * ev ) m_mousePressedInBoundy = false; } + + +void QssMainWindow::dpiScaleChildren() +{ + +} + void QssMainWindow::showEvent(QShowEvent *ev) { @@ -691,7 +713,7 @@ QssDialog::QssDialog(QWidget *parent) m_frame = new QFrame(parent); m_frame->setObjectName("dialog");//css m_frame->setAttribute(Qt::WA_TranslucentBackground); - m_frame->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint| Qt::WindowSystemMenuHint/* | Qt::WindowMinimizeButtonHint*/);//Qt::WindowMinimizeButtonHintdialog�� + m_frame->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint| Qt::WindowSystemMenuHint/* | Qt::WindowMinimizeButtonHint*/);//Qt::WindowMinimizeButtonHintdialog m_frame->setMouseTracking(true); m_frame->installEventFilter(this); @@ -709,7 +731,6 @@ QssDialog::QssDialog(QWidget *parent) mShadowMask = new QWidget(this); mShadowMask->setStyleSheet("QWidget{background-color:rgba(1,1,1,0.3);}"); mShadowMask->hide(); - } QssDialog::~QssDialog() diff --git a/Qss.h b/Qss.h index 9c9e748..38c0ad3 100644 --- a/Qss.h +++ b/Qss.h @@ -15,6 +15,7 @@ #include "ui_qsstoast.h" #include "ui_process.h" +#include #ifdef __MINGW32__ #include "windows.h" @@ -31,92 +32,7 @@ class QMouseEvent; #endif -typedef enum{ - RA_Resize = 1, - RA_FixedWidth = 2, - RA_FixedHeight = 4, - RA_FixedSize = 8, - RA_MinimumSize = 16, - RA_MinimumHeight = 32, - RA_MinimumWidth = 64, - RA_MaximumSize = 128, - RA_MaximumHeight = 256, - RA_MaximumWidth = 512 -}ReiszeActions ; - - - -#define DECLARE_RESIZE() \ - void resize(int w, int h);void resize(const QSize &); void setFixedHeight(int w); \ - void setFixedWidth(int w);void setFixedSize(int w, int h);void setFixedSize(const QSize &s); \ - void setMinimumSize(const QSize &);void setMinimumSize(int minw, int minh); \ - void setMinimumHeight(int minh);void setMinimumWidth(int minw); \ - void setMaximumSize(const QSize &);void setMaximumSize(int maxw, int maxh); \ - void setMaximumHeight(int minh);void setMaximumWidth(int minw); - -// 用宏强制覆盖的方法不使用了,因为QSSMainWindow本身已经在event事件内做处理,每个event都重写了,无需再去覆盖。 -#define DEFINE_RESIZE(name)\ - void Qss##name::resize(int w, int h){ m_sizeActions |= RA_Resize; float scale = cale; m_size = QSize(w, h);Q##name::resize(m_size.width() * scale, m_size.height() * scale);}\ - void Qss##name::resize(const QSize & size){ m_sizeActions |= RA_Resize; float scale = cale;m_size = size;Q##name::resize(m_size * scale);}\ - void Qss##name::setFixedHeight(int h){m_sizeActions |= RA_FixedHeight;float scale = cale;m_size.setHeight(h);Q##name::setFixedHeight(m_size.height() * scale);}\ - void Qss##name::setFixedWidth(int w){m_sizeActions |= RA_FixedWidth;float scale = cale;m_size.setWidth(w);Q##name::setFixedWidth(m_size.width() * scale);}\ - void Qss##name::setFixedSize(int w, int h){m_sizeActions |= RA_FixedSize;float scale = cale; m_size = QSize(w, h); this->m_frame->setFixedSize(m_size.width() * scale, m_size.height() * scale) ; }\ - void Qss##name::setFixedSize(const QSize & size){m_sizeActions |= RA_FixedSize;float scale = cale; m_size = size; Q##name::setFixedSize(m_size * scale);}\ - void Qss##name::setMinimumSize(const QSize & size){m_sizeActions |= RA_MinimumSize;float scale = cale;m_minimumSize = size; Q##name::setMinimumSize(m_minimumSize * scale);}\ - void Qss##name::setMinimumSize(int w, int h){m_sizeActions |= RA_MinimumSize;float scale = cale; m_minimumSize = QSize(w, h); Q##name::setMinimumSize(m_minimumSize.width() * scale, m_minimumSize.height() * scale);}\ - void Qss##name::setMinimumHeight(int h){m_sizeActions |= RA_MinimumHeight;float scale = cale;m_minimumSize.setHeight(h); Q##name::setMinimumHeight(m_minimumSize.height() * scale);}\ - void Qss##name::setMinimumWidth(int w){m_sizeActions |= RA_MinimumWidth;float scale = cale; m_minimumSize.setWidth(w); Q##name::setMinimumWidth(m_minimumSize.width() * scale);}\ - void Qss##name::setMaximumSize(const QSize & size){m_sizeActions |= RA_MaximumSize;float scale = cale; m_maximumSize = size; Q##name::setMaximumSize(m_maximumSize * scale);}\ - void Qss##name::setMaximumSize(int w, int h){m_sizeActions |= RA_MaximumSize;float scale = cale; m_maximumSize = QSize(w, h); Q##name::setMaximumSize(m_maximumSize.width() * scale, m_maximumSize.height() * scale);}\ - void Qss##name::setMaximumHeight(int h){m_sizeActions |= RA_MaximumHeight;float scale = cale; m_maximumSize.setHeight(h); Q##name::setMaximumHeight(m_maximumSize.height() * scale);}\ - void Qss##name::setMaximumWidth(int w){m_sizeActions |= RA_MaximumWidth;float scale = cale; m_maximumSize.setWidth(w); Q##name::setMaximumWidth(m_maximumSize.width() * scale);} - -#define DEFINTE_SCALE_RESIZE(name)\ - if (m_sizeActions.testFlag(RA_FixedWidth)){Qss##name::setFixedWidth(m_size.width() * scale);}\ - if (m_sizeActions.testFlag(RA_FixedHeight)){Qss##name::setFixedHeight(m_size.height() * scale);}\ - if (m_sizeActions.testFlag(RA_FixedSize)){Qss##name::setFixedSize(m_size * scale);}\ - if (m_sizeActions.testFlag(RA_Resize)){ QSize newSize = m_size * scale;if(minimumSize().width() > newSize.width()){name::setMinimumSize(newSize);}name::resize(newSize);}\ - if (m_sizeActions.testFlag(RA_MinimumSize)){Qss##name::setMinimumSize(m_minimumSize * scale);}\ - if (m_sizeActions.testFlag(RA_MinimumHeight)){Qss##name::setMinimumHeight(m_minimumSize.height() * scale);}\ - if (m_sizeActions.testFlag(RA_MinimumWidth)){Qss##name::setMinimumWidth(m_minimumSize.width() * scale);}\ - if (m_sizeActions.testFlag(RA_MaximumSize)){Qss##name::setMaximumSize(m_maximumSize * scale);}\ - if (m_sizeActions.testFlag(RA_MaximumHeight)){Qss##name::setMaximumHeight(m_maximumSize.height() * scale);}\ - if (m_sizeActions.testFlag(RA_MaximumWidth)){ Qss##name::setMaximumWidth(m_maximumSize.width() * scale); }\ - cale = scale; - -typedef class ICallDPIChanged -{ - virtual void ScaleChanged(float scale) = 0; - virtual WId GetWID() const = 0; - virtual void SetScale(float scale) = 0; -protected: - uint32_t m_sizeActions; - float cale = 1; - QSize m_size; - QSize m_minimumSize; - QSize m_maximumSize; -}QssCallDpiChanged; - -typedef class IDPIHelper -{ - virtual bool DPIChanged(unsigned short, WId) = 0; - virtual void RemoveDPIRecord(WId) = 0;//移除指定native窗体的DPI记录 一般用于native窗体析构时 - virtual float GetDPIScale(WId) const = 0; - virtual float GetOldDPIScale(WId) const = 0; - virtual QString GetStyleSheet(WId) const = 0;//获取指定DPI下的样式表 - virtual float GetScaleNumber(float, WId) const = 0;//获取指定DPI下的数值 缩放后数值 - virtual QList GetAllWindowID() const = 0;//获取所有自己加载过皮肤的窗口ID - - //优化接口 主要是为了适配用户主机只有一种DPI时使用 - virtual bool IsOnlyOneDPI() const = 0;//获取用户主机是否只有一种DPI - virtual void RefrushDPIRecords() = 0;//显示器数量发生了变化 刷新历史显示器DPI记录 - virtual void SetDefaultScale(float scale) = 0;//设置缺省DPI值 当显示器dpi只有一种时刷新 - virtual float GetDefaultScale() const = 0;//获取缺省DPI缩放值 只有当机器上所有的显示器为统一dpi时起作用 -}QssDpiHelper; - -IDPIHelper * GetDPIHelper(); -#define DPIHelper() GetDPIHelper() class QssPushButton : public QPushButton{ public: QssPushButton(QWidget *parent,QString objName); @@ -209,12 +125,13 @@ public: } }; -class QssMainWindow : public QMainWindow,ICallDPIChanged +class QssMainWindow : public QMainWindow { Q_OBJECT public slots: void OnMaxOrRestore(bool max); + void DpiChange(qreal); public: typedef enum{ EVENT_MOVE = 523, @@ -223,6 +140,7 @@ public: virtual ~QssMainWindow(); QWidget *TitleBar(); + void DetectDpiChange(); void ShowMask(); void HideMask(); void show(); @@ -239,16 +157,15 @@ public: inline QFrame* frame(){return m_frame;} int CalCursorCol(QPoint pt); //计算鼠标X的位置 virtual bool eventFilter(QObject * obj, QEvent * ev); - bool nativeEvent(const QByteArray &eventType, void *message, long *result); private: void onMouseMoveEvent(QMouseEvent * ev); void onMousePressEvent(QMouseEvent * ev); void onMouseReleaseEvent(QMouseEvent * ev); + void dpiScaleChildren(); protected: QFrame* m_frame; QRect mFrameRect; - QRect mRect; QRect m_CentralRect; QssTtitleBar* m_titleBar; void showEvent(QShowEvent *ev); @@ -271,8 +188,9 @@ private: bool m_bLeftPress; QRect m_rtPreGeometry; QPoint m_ptViewMousePos; - float m_scale; + float m_dpi_ratio; QWidget *mShadowMask; + QScreen *mCurrentScreen; };