qt程序在不同分辨率和缩放比情况下保持视觉效果相同

2025-04-11  本文已影响0人  豪爵吸金ing
#include <QApplication>
#include <QtWidgets>


qreal getSystemDpiRatio(){
    QScreen* screen = QGuiApplication::primaryScreen();
    return screen ? screen->logicalDotsPerInch()/96.0 : 1.0;
}

void logDpi(int argc, char *argv[]){
    auto systemDpiRatio = getSystemDpiRatio();
    qreal targetScale = 2.0 /systemDpiRatio;
    QString scaleStr = QString::number(targetScale,'f',4);

    qDebug()<<"==========systemDpiRatio :"<<systemDpiRatio;
    qDebug()<<"============scaleStr :"<<scaleStr;
}

void myDemoFun(){

    // 创建主窗口
    QWidget *mainWindow = new QWidget;
    mainWindow->setWindowTitle("Image Viewer");

    // 创建滚动区域
    QScrollArea *scrollArea = new QScrollArea;
    scrollArea->setWidgetResizable(true);  // 设置为可调整大小

    // 创建 QLabel 用于显示图片
    QLabel *imageLabel = new QLabel;
    QPixmap image("D:/demo.jpg");  // 加载图片

    // 检查图片是否加载成功
    if (image.isNull()) {
        qWarning("Could not load image abc.jpg");
        return;
    }

    imageLabel->setPixmap(image);  // 设置标签的图片
    scrollArea->setWidget(imageLabel);  // 将标签添加到滚动区域

    // 设置布局
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(scrollArea);
    mainWindow->setLayout(layout);

    mainWindow->showFullScreen();
}

void setManScaleFactor(int argc, char *argv[]){
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);

    // 获取系统DPI缩放比例
    qreal systemDpiRatio = getSystemDpiRatio();

    // 获取屏幕逻辑尺寸
    QScreen* screen = QGuiApplication::primaryScreen();
    QRect screenGeometry = screen->geometry();

    // 计算物理尺寸(逻辑尺寸 * 系统缩放)
    int physicalWidth = screenGeometry.width() * systemDpiRatio;
    int physicalHeight = screenGeometry.height() * systemDpiRatio;

    // 计算目标缩放因子
    qreal screenRatio = sqrt((physicalWidth * physicalHeight) / (1920.0 * 1080.0));
    qreal targetScale = screenRatio / systemDpiRatio;

    // 设置环境变量
    QString scaleStr = QString::number(targetScale, 'f', 2);
    qputenv("QT_SCALE_FACTOR", scaleStr.toUtf8());

    qDebug() << "System DPI Ratio:" << systemDpiRatio;
    qDebug() << "Physical Resolution:" << physicalWidth << "x" << physicalHeight;
    qDebug() << "Calculated QT_SCALE_FACTOR:" << targetScale;
}



int main(int argc, char *argv[]) {
    setManScaleFactor(argc,argv); //手动设置缩放
    QApplication app(argc, argv);
    myDemoFun();//测试程序
    return app.exec();
}

上一篇 下一篇

猜你喜欢

热点阅读