Qt中根据pc屏幕分辨率按比例修改窗口的大小

#ifndef FITWINDOW_H
#define FITWINDOW_H
#include <QObject>
#include <QWidget>

///
/// \brief The FitWindow class,适用于固定尺寸及内部控件大小位置固定的窗口
///
class FitWindow : public QObject
{
    Q_OBJECT
public:
    FitWindow();
    static void resetUI(QWidget* pWidget);
    static float getScale();
};

#endif // FITWINDOW_H


#include "fitwindow.h"
#include <QObjectList>
#include <QDesktopWidget>
#include <QApplication>
#include <QMetaProperty>
#include <QPushButton>
FitWindow::FitWindow()
{

}

void FitWindow::resetUI(QWidget *pWidget)
{
    if(!pWidget){
        return;
    }
    QDesktopWidget* desktopWidget = QApplication::desktop();
    //获取可用桌面大小
    QRect deskRect = desktopWidget->availableGeometry();
    // 如果分辨率已经在1920及以上,则不需要进行处理
    if(deskRect.width() >= 1920){
        return;
    }
    //仅使用x比例,否则窗口会变形
    float scale = deskRect.width() / 1920.0;
    QObjectList lst = pWidget->children();
    QPoint pt(0,0);
    for(auto l : lst)
    {
        auto widget = qobject_cast<QWidget*>(l);
        if(widget)
        {
            pt = widget->pos();

            widget->move(QPoint(pt.x() * scale, pt.y() * scale));
            widget->resize(widget->width() * scale, widget->height() * scale);

            QFont font;
            int nIndex = widget->metaObject()->indexOfProperty("font");
            auto propertyFont = widget->metaObject()->property(nIndex);

            QVariant var =  propertyFont.read(widget);
            if(var.canConvert(QMetaType::QFont))
            {
                font = var.value<QFont>();

                font.setPointSizeF(font.pointSizeF() * scale);
                propertyFont.write(widget,QVariant::fromValue(font));
            }

            QPixmap pixmap;
            nIndex = widget->metaObject()->indexOfProperty("pixmap");
            auto pixmapProp = widget->metaObject()->property(nIndex);

            var = pixmapProp.read(widget);
            if(var.canConvert(QMetaType::QPixmap))
            {
                pixmap = var.value<QPixmap>();
                if(!pixmap.isNull())
                {
                    QSize sizePixmap(pixmap.size().width() * scale, pixmap.size().height() * scale);

                    pixmap =  pixmap.scaled(sizePixmap);
                    pixmapProp.write(widget,QVariant::fromValue(pixmap));
                }
            }
        }
    }

    pWidget->resize(pWidget->width() * scale, pWidget->height() * scale);
}

float FitWindow::getScale()
{
    QDesktopWidget* desktopWidget = QApplication::desktop();
    //获取可用桌面大小
    QRect deskRect = desktopWidget->availableGeometry();

    return deskRect.width() / 1920.0;
}


使用:

FitWindow::resetUI(pToolsDlg);



  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值