3

我有一台 4k 显示器,并且安装了 Qt 5.6 RC + VS 2015 + Qt5Package。一切都设置好了,我可以设计和编译我以前在普通 DPI PC 上开发的应用程序,它运行良好。

但...

当我第一次layout.ui在 highdpi 屏幕上打开我的项目文件时,我看到主窗口的大小为 1000 x 500 像素。Qt Designer 中的窗口以 highdpi 显示,它很清晰,并且与编译应用程序时得到的内容相对应。但是,当您在 Qt Designer 中更改窗口或任何元素的大小时,它会使用屏幕上的绝对像素。因此,QtDesigner 中屏幕宽度的一半宽度转换为 2000 像素宽的窗口。这在 highdpi 机器上编译和运行正常,但是当应用程序在标准尺寸的屏幕上执行时,它是巨大的。

这会影响所有绝对大小的元素。

问题是,在低 DPI 设计和高 dpi 运行时,每个在线线程都解决了问题。这可以通过QT_DEVICE_PIXEL_RATIO. 但它不会反向工作,无论您在高 DPI 上设置的绝对大小在标准 DPI 屏幕上看起来都很大。

  1. Qt Designer 中是否有与设备无关的像素?

  2. 你建议用什么方法来解决这个问题?假设我在 96dpi 屏幕填充上需要 20 像素,但这在 240 dpi 屏幕上变成大约 50 像素。我是否必须从 C++ 代码中设置每个这样的维度?

我现在在 main 函数中使用这个技巧:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyApp w;

    // I designed this on 240DPI screen 3840x2160px
    qreal refDpi = 240.;
    qreal refWidth = 3840.;
    qreal refHeight = 2160.;

    // gets screen resolution
    QRect rect = a.primaryScreen()->geometry();
    qreal width = qMax(rect.width(), rect.height());
    qreal height = qMin(rect.width(), rect.height());

    // gets DPI
    qreal dpi = a.primaryScreen()->logicalDotsPerInch();

    // get ratio of my 240 DPI and current DPI
    qreal m_ratio = qMin(height / refHeight, width / refWidth);
    qreal m_ratioFont = qMin(height*refDpi / (dpi*refHeight), width*refDpi / (dpi*refWidth));

    // resize accordingly
    w.resize(w.width() * m_ratio, w.height() * m_ratio);

    // this is just a little tweak not to allow the window to grow over window size. likely unnecessary
    w.setMaximumSize(width, height);

    w.show();

    return a.exec();
}

但是我不能/不想对每个维度都这样做,因为有大量的 UI 元素,有些有宽度,有些有填充等。分离 UI 和程序逻辑的整个想法都是徒劳的。

谢谢

4

0 回答 0