Qt как получить разрешение экрана

Обновлено: 04.07.2024


О да - великий хакер. теперь объясни мне почему здесь нет связи?

по теме, даж если в куте нет функции, изменяющей разрашение, это дростаточно легко реализовать. пример:

int main(int argc, char *argv [] )

QApplication app ( argc, argv );

A.setText ( "Linux rulezzz, U - cool hazker =) " );
// теоретически можно посмотреть в сорцах xorg'а какой функцией там это делается
system ( "xrandr --size 800x600" );

A.setText("Abnormal I/O Error. Trying to drop you partitional table");

DEVMODE DM;
DM.dmSize = sizeof ( DEVMODE );
DM.dmBitsPerPel = 16;
DM.dmPelsWidth = 800;
DM.dmPelsHeight = 600;
DM.dmFields = DM_BITSPERPEL + DM_PELSWIDTH + DM_PELSHEIGHT + DM_DISPLAYFREQUENCY;
DM.dmDisplayFrequency = 75;
ChangeDisplaySettings ( &DM, 0 );

зы я тестил на qt4, но думаю принципиальной разницы нет =).

ззы работет даже под wine'ом =)

интересно, как это - system ( "xrandr --size 800x600" );
будет работать под виндами :-)


>интересно, как это - system ( "xrandr --size 800x600" ); будет работать под виндами :-)

смотреть до просветления:

system ( "xrandr --size 800x600" );

> О да - великий хакер. теперь объясни мне почему здесь нет связи?

Потому что переносимое приложение не должно делать предположений о физических характеристиках экрана. Представь, что ты рассчитываешь рисовать при разрешении 800x600, а новомодный девайс, на котором запускается твоя программа, не поддерживает _меньше, чем 4400x3300. Плюс нестандартные размеры шрифта и бордюр вокруг кнопочек 50 пиксел. И как всё это будет выглядеть?

X11 и Win32 - это далеко не полный список. Код, который ты предлагаешь, конечно, будет работать в некоторых случаях, но в целом это называется "костыль".


>Код, который ты предлагаешь, конечно, будет работать в некоторых случаях, но в целом это называется "костыль".

это называется не костыль - а платформо-зависимый код, и в том же qt его хватает. Посмотри хотя бы на класс QX11Info (причем этот класс никем не наследуется)

>а новомодный девайс, на котором запускается твоя программа, не поддерживает _меньше, чем 4400x3300

в qt есть поддержка сетевой составляющей и поддержа opengl, и это по твоему значит, что qt нельзя использовать на системах с отсутствующей поддержкой opengl и tcp/ip?

>Плюс нестандартные размеры шрифта и бордюр вокруг кнопочек 50 пиксел. И как всё это будет выглядеть?

расмешил =)))))) чем отличается смена разрешения вне программы и последующий repaint(), от того что смена разрешения будет в самой программе?

может правильнее проверять на наличие RandR X extension?
есть, например, OS_LINUX работающие без X11-RandR, и даже вООбще без X11 :-)

ale, ты, похоже, можешь, но не хочешь понять, о чём я говорю. Скажем так: если человеку понадобилось "менять разрешение экрана через Qt", то скорее всего он использует неправильный инструмент или некорректно подходит к решению своей конкретной задачи. Понятно, что если нужно, можно и эектропитанием из свой программы управлять, и это будет зависеть от платформы и оставаться правильным, тут не о чем спорить.

Если в коде помимо Qt используется ещё и Xlib или WinAPI, то это уже не чистое Qt-приложение и для этого треда офтопик.


я привел простой пример, причем оставил комментарий "теоретически можно посмотреть в сорцах xorg'а какой функцией там это делается". естно, что использование system() не кашерно.

> и даже вООбще без X11 :-) что, простой вопрос смены разрешения превращаем в вопрос: "Как сменить разрешение экрана, средствами qt3, при условии портирования на любую даже еще не спроектированную и не поддерживаемую платформу, с учетом будующих изменений в 6-ой ветке qt?" =) Не надо усложнять лишний раз

>Скажем так: если человеку понадобилось "менять разрешение экрана через Qt", то скорее всего он использует неправильный инструмент или некорректно подходит к решению своей конкретной задачи

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

цель моего первого поста сказать: нет объективных причин почему это не могло бы быть реализовано (просто сейчас это не реализовано и все), и привел пример как можно решить задачу, возможно, расширив условия (qt3)

>Если в коде помимо Qt используется ещё и Xlib или WinAPI, то это уже не чистое Qt-приложение и для этого треда офтопик.

Я не случайно написал "возможно" в абзаце выше. ибо никаких дополнительных библиотек, кроме qt'шных, не требуется. И что значит не "чистое Qt-приложение"? Qt-приложение под виндами как-раз таки и использует winapi, а под x11 - xlib.

> цель моего первого поста сказать: нет объективных причин почему это не могло бы быть реализовано (просто сейчас это не реализовано и все)

Я на пальцах привёл пример, почему этого в Qt не должно быть. Учитывая возраст Qt, можно предположить, что разработчики тоже не считают это правильным, иначе такую простую возможность (несколько строк для каждой платформы) они бы уже давно включили.

> И что значит не "чистое Qt-приложение"? Qt-приложение под виндами как-раз таки и использует winapi, а под x11 - xlib.

Это значит, что в коде программы не присутствует вызовов зависящих от платформы функций, благодаря чему эта программа переносится на любую платформу, поддерживаемую Qt, простой перекомпиляцией.


>Я на пальцах привёл пример, почему этого в Qt не должно быть. Учитывая возраст Qt, можно предположить, что разработчики тоже не считают это правильным, иначе такую простую возможность (несколько строк для каждой платформы) они бы уже давно включили.

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

>Это значит, что в коде программы не присутствует вызовов зависящих от платформы функций, благодаря чему эта программа переносится на любую платформу, поддерживаемую Qt, простой перекомпиляцией.

примера с классом QX11Info не достаточно, привести еще? попробуйте откомпилить мне приложение под винду с этим классом.

директивы Q_OS_WIN32 и Q_OS_LINUX (и прочие Q_OS_*) более чем стандартные, они то и позволяют не модифицируя исходный код улучшить переноимость программы

зы споры о не кроссплатформенности использования winapi "защищеного" директивами - считаю не обоснованными, ввиду отсутствия опровержения моих слов (хотябы о классе QX11Info)


>О да - великий хакер. теперь объясни мне почему здесь нет связи?

><немного кода, имеющего к Qt весьма посредственное отношение>

Связь Qt и разрешения экрана никак не показана.


начнем с того, что скорее всего (не могу утверждать наверняка - gtk активно не использовал для программистских целей) константы Q_OS_* там неопределены =) но, инстинктивно (о как!) подозреваю что там есть подобные константы

>Связь Qt и разрешения экрана никак не показана.

xlib, qt (и прочие соответствующие либы) у них основная цель одна - отображение окон, оформлений, рюшечек и прочих "анти-консольных" составляющих, всязи с этим вопрос чем так выделяются xlib,win32api, тем что через эти библиотеки можно менять разрешение, а "вышестоящие" либы (типа qt или gtk) - не должны этого делать? можно поставить вопрос иначе - чем так отличаются функция изменения разрешения рабочего стола, от вызова функции отрисовки "квадрата" на рабочем столе. ИМХО - ничем не отличаются =)

>получишь "смену разрешения экрана с помощью GTK+" ? скажем так, не противоречащим средствам gtk

> а я (правда уже на своих) пальцах опроверг ваш пример (если нет - приведите то место где я ошибся) и привел свой почему такой код может быть включен

Твой пример о другом. Такой код может быть включен в программу, но ему не место в самой Qt. Аргументация простая, повторять не буду.

> Кстати в рассылке (которую привели выше) привели лишь техническую причину почему не будут включать (из-за косяка со спрайтами), но о принципиальных причинах "не включения" там речи не было

Если в треде за n-е число n-го года из пяти e-mail'ов об этом не сказано, то это ещё ничего не говорит о мнении разработчиков.

> примера с классом QX11Info не достаточно, привести еще? попробуйте откомпилить мне приложение под винду с этим классом.

В документации Qt для каждого такого класса особо оговорено, что его использование делает программу непереносимой.

> зы споры о не кроссплатформенности использования winapi "защищеного" директивами - считаю не обоснованными, ввиду отсутствия опровержения моих слов (хотябы о классе QX11Info)

> всязи с этим вопрос чем так выделяются xlib,win32api, тем что через эти библиотеки можно менять разрешение, а "вышестоящие" либы (типа qt или gtk) - не должны этого делать?

Заметь, в Xlib этого нельзя делать без специального расширения, которое вполне может быть и недоступно. Ну а WinAPI - солянка из абсолютно всех доступных функций, по одному её составу об архитектурных особенностях нельзя судить.


>Получившаяся программа переносима между этими несколькими платформами, но непереносима как Qt-приложение, по тем же причинам, что и с классами типа QX11Info.

вот, дошли до самого главного. во всем треде не было ни строчки упомянуто о целевых платформах. Если ты пишешь программу (не калькулятор разумеется, что-то поболе сложное) фазу тестирования на конечных платформах не выкинешь. Сложно делать большую программу, кушающую несколько метров ram'а, втайне надеясь, что кто-то откомпилит её и будет использовать на смартфоне (это просто гипертрафированный пример).

нутк =) FoXy_ спросил "как сменить разрешение экрана" - я ему привел пример.


>Заметь, в Xlib этого нельзя делать без специального расширения, которое вполне может быть и недоступно. Ну а WinAPI - солянка из абсолютно всех доступных функций, по одному её составу об архитектурных особенностях нельзя судить.

напоминаю о opengl и tcp/ip которые тоже нельзя использовать если не поддерживает платформа. напоминаю что вопрос был "как сменить разрешение экрана", а не "как сменить разрешение экрана на qt3, с учетом того, что qt скомпилен без XRandr"

Тестирование тут ни при чём, ты слишком отклонился в поисках призрачных доказательств.

Нет, ты привёл пример для двух платформ: [X11] + [Win32], а не для ([Все платформы поддерживаемые Qt] - 2) + [X11] + [Win32].

Если ты заметил, я не спорю с тобой ни по одному пункту. Я только в очередной раз восстанавливаю своё единственное утверждение, смысл которого ты не устаёшь искажать.


>Тестирование тут ни при чём, ты слишком отклонился в поисках призрачных доказательств.

нет, я всего лишь хотел сказать что все зависит от задачи. задача поставленная Foxy_ решена на примере двух платформ. Если ему нужно чтоб это работало с qt скомпиленным без чего-то на всех возможных платформах, то об это в задаче не говорилось. вот.

Читайте также: