Пользовательское масштабирование курсора с настройками специальных возможностей Windows

avatar
karl_simmons
1 июля 2021 в 17:53
128
1
0

Я реализовал пользовательские курсоры 32x32 с растровыми изображениями, используя следующий подход (в Qt 6.1.1):

this->setCursor(QCursor(QBitmap(":/Cursors/arrow_up.bmp"), QBitmap(":/Cursors/arrow_up_mask.bmp"), 3, 0));

Курсоры работают должным образом, если для параметра отображения Windows для размера приложений и текста установлено значение 100%. Однако, если размер приложений и текстовой настройки увеличен, Qt соответствующим образом масштабирует пользовательские курсоры, и они становятся пикселизированными (например, если выбрано 150%, Qt увеличивает размер пользовательских курсоров на 50%).

Есть ли способ запретить Qt изменять размер пользовательских курсоров? В качестве альтернативы, есть ли способ узнать, что пользователь выбрал в Windows для размера приложений и текста, чтобы я мог предоставить курсоры с правильным разрешением?

Источник

Ответы (1)

avatar
Parisa.H.R
1 июля 2021 в 18:01
0

Попробуйте это:

QCursor cursor = QCursor(QIcon(":/Cursors/arrow_up.bmp").pixmap(32, 32), 0, 0);
this->setCursor(cursor);

означает, что используется QIcon вместо QBitmap и устанавливается его размер pixmap(32, 32).

Другие вещи, которые могут вам помочь:

поместите эту строку в файл main.cpp:

QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

Читать этот документ . Насколько я понимаю, установка флага AA_EnableHighDpiScaling Включает масштабирование с высоким разрешением в Qt на поддерживаемых платформах (см. также Дисплеи с высоким разрешением). Поддерживаемые платформы: X11, Windows и Android. Включение заставляет Qt масштабировать основную (независимую от устройства) систему координат в соответствии с масштабными коэффициентами отображения, предоставляемыми операционной системой. Это соответствует установке для переменной среды QT_AUTO_SCREEN​_SCALE_FACTOR значения 1.

.
karl_simmons
1 июля 2021 в 20:18
0

Спасибо, Париса. К сожалению, Qt по-прежнему увеличивает курсор при использовании этого подхода (хотя пикселизация немного меньше, чем при непосредственном использовании растровых изображений).

Parisa.H.R
1 июля 2021 в 20:26
0

Добро пожаловать! Попробуйте использовать файл SVG значка курсора вместо файла bmp.

karl_simmons
2 июля 2021 в 20:02
0

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

Parisa.H.R
2 июля 2021 в 20:41
0

Итак, я думаю, что лучше иметь несколько иконок. В разном размере и разрешении и установите какое-то условие, что если изменить значки разрешения экрана, я думаю, что в ОС, таких как Windows или Linux, это произойдет.

karl_simmons
4 июля 2021 в 13:03
0

Я согласен. Это кажется лучшим решением. Однако похоже, что Qt предполагает, что размер, который вы предоставляете, основан на настройке размера текста 100% в Windows (т.е. pixelDeviceRatio = 1), а затем независимо масштабирует курсор. Таким образом, даже если я предоставлю курсор 64x64 для pixelDeviceRatio = 2, Qt возьмет его и снова увеличит. Любые идеи о том, как остановить Qt от применения коэффициента масштабирования?

Parisa.H.R
4 июля 2021 в 13:20
0

Ну, это произошло в режиме Released? Я спросил, потому что иногда бывает по-другому. между режимом отладки и режимом выпуска.

Parisa.H.R
5 июля 2021 в 17:39
0

@karl_simmons Я отредактировал свой ответ, надеюсь, это поможет вам. Поместите QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); в файл main.cpp

karl_simmons
7 июля 2021 в 14:16
0

Спасибо. Я пробовал это, но в Qt6 я получаю предупреждение о том, что масштабирование с высоким разрешением включено по умолчанию. Есть ли другой способ установить QT_AUTO_SCREEN​_SCALE_FACTOR = 1?

Parisa.H.R
7 июля 2021 в 18:12
0

Я не использую Qt 6, потому что он нестабилен. Но я тестирую этот флаг в Qt5.14.