1. 程式人生 > >Qt中根據pc螢幕解析度按比例修改視窗的大小

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);