Как работать в QTDesigner на дисплее с высоким DPI?

У меня есть монитор 4k, и я установил Qt 5.6 RC + VS 2015 + Qt5Package. Все настроено, я могу проектировать и компилировать свои приложения, разработанные ранее, на обычном ПК с DPI, и все работает отлично.

Но…

Когда я впервые открыл layout.ui Файл моего проекта на экране высокого разрешения, я увидел, что главное окно было размером 1000 х 500 пикселей. Окно в Qt Designer отображается с высоким разрешением, оно четкое и соответствует тому, что вы получаете при компиляции приложения. Но когда вы изменяете размер окна в Qt Designer или любого другого элемента, он использует абсолютные пиксели на вашем экране. Таким образом, половина ширины экрана в QtDesigner преобразуется в окно шириной 2000 пикселей. Это компилируется и работает нормально на машине с высоким разрешением, но когда приложение выполняется на экране стандартного размера, это огромно.

Это влияет на все элементы, которые абсолютно размера.

Проблема в том, что каждый поток в сети решает проблемы при проектировании с низким DPI и работе с высоким dpi. Это может быть сделано QT_DEVICE_PIXEL_RATIO, Но это не сработает наоборот, какой бы абсолютный размер вы не установили для highDPI, он будет выглядеть огромно на стандартном экране DPI.

  1. Есть ли что-то как независимые от устройства пиксели в Qt Designer?

  2. Какой подход вы предлагаете решить эту проблему? Скажем, мне нужно 20px для экранных полей с разрешением 96 точек на дюйм, но на экране с разрешением 240 точек на дюйм это составляет около 50 пикселей. Должен ли я установить КАЖДОЕ такое измерение из кода C ++?

Теперь я использую этот трюк внутри основной функции:

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

Но я не могу / не хочу делать это для каждого отдельного измерения, поскольку существует множество элементов пользовательского интерфейса, а некоторые имеют ширину, некоторые имеют отступы и т. Д. Вся идея разделения пользовательского интерфейса и программной логики будет напрасной.

Спасибо

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]