Qt中根據pc螢幕解析度按比例修改視窗的大小
阿新 • • 發佈:2019-02-04
#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);