LINUX.ORG.RU

Нет никакой связи между Qt и разрешением экрана.

erDiZz
()

>Нет никакой связи между Qt и разрешением экрана.

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

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

#include <QPushButton>
#include <QApplication>

#if defined Q_OS_WIN32
#include <windows.h>
#endif

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

QApplication app ( argc, argv );

QPushButton A;

#if defined Q_OS_LINUX

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

#elif defined Q_OS_WIN32

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

#endif

A.show();
app.exec();

return 0;}

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

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

ale ★★
()
Ответ на: комментарий от Valeriy_Onuchin

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

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

#if defined Q_OS_LINUX

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

#elif defined Q_OS_WIN32

ale ★★
()
Ответ на: комментарий от ale

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

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

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

erDiZz
()
Ответ на: комментарий от erDiZz

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

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

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

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

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

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

ale ★★
()
Ответ на: комментарий от ale

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

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

erDiZz
()
Ответ на: комментарий от Valeriy_Onuchin

>> #if defined Q_OS_LINUX > >может правильнее проверять на наличие RandR X extension? есть, например, OS_LINUX работающие без X11-RandR,

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

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

>http://lists.trolltech.com/qt-interest/2005-11/thread00561-0.html в рассылке на последний вопрос так и не ответили =)

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

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

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

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

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

ale ★★
()
Ответ на: комментарий от ale

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

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

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

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

erDiZz
()
Ответ на: комментарий от erDiZz

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

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

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

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

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

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

ale ★★
()
Ответ на: комментарий от ale

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

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

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

Замени создание и инициализацию Qt-приложения на аналогичные действия на GTK+, оставив всякие #if defined Q_OS_LINUX .... #elif defined Q_OS_WIN32 .... #endif --- получишь "смену разрешения экрана с помощью GTK+" ?

=)))

MYMUR ★★★★
()
Ответ на: комментарий от MYMUR

> Замени создание и инициализацию Qt-приложения на аналогичные действия на GTK+, оставив всякие #if defined Q_OS_LINUX .... #elif defined Q_OS_WIN32 .... #endif ---

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

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

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

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

ale ★★
()
Ответ на: комментарий от ale

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

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

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

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

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

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

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

Если для какой-то определённой платформы делается исключение, и специфичный для неё код обрамляется #ifdef'ами, то это ещё более-менее нормально. Но со сменой разрешения другой случай: множество поддерживаемых платформ определяется не множеством платформ, поддерживаемых Qt в настоящем и в будущем, а тем, о каких платформах мы успели подумать при написании программы. Получившаяся программа переносима между этими несколькими платформами, но непереносима как Qt-приложение, по тем же причинам, что и с классами типа QX11Info.

erDiZz
()
Ответ на: комментарий от ale

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

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

erDiZz
()
Ответ на: комментарий от erDiZz

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

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

>Если для какой-то определённой платформы делается исключение, и специфичный для неё код обрамляется #ifdef'ами, то это ещё более-менее нормально.

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

ale ★★
()
Ответ на: комментарий от erDiZz

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

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

ale ★★
()
Ответ на: комментарий от ale

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

>>Если для какой-то определённой платформы делается исключение, и специфичный для неё код обрамляется #ifdef'ами, то это ещё более-менее нормально. >нутк =) FoXy_ спросил "как сменить разрешение экрана" - я ему привел пример.

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

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

erDiZz
()
Ответ на: комментарий от erDiZz

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

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

ale ★★
()
Ответ на: комментарий от ale

Кстати, там выше есть тред про трей, и там как раз оправданно сделать #ifdef'ы и спрятать окошко с помощью WinAPI, потому что для Linux и других платформ при этом ничего не изменится.

erDiZz
()
Ответ на: комментарий от Gharik

лучший способ доказать, кто Прав, а кто Не прав ...
наклепать патч и отослать его троллям ..
посмотрим через какое время появится что-нибудь типа
static QDesktopWidget::setScreenResolution (или QApplication::xxx).

++
для win32 и X11+RandR тема исчерпана, а как быть с Carbon-oм?

Valeriy_Onuchin ★★
()

o_O Стоило. только на полдня отойти от компа... Собствено интересовало наличие функции типа

>QDesktopWidget::setScreenResolution (или QApplication::xxx).

как я понял из вашей оживленно беседы, такого на данный момент нет.

за неимением оной, меня вполне устроит пример ale.

Всем принявшим участие, спасибо.

FoXy_
() автор топика
Ответ на: комментарий от FoXy_

>за неимением оной, меня вполне устроит пример ale.

[ ale вешая очередную медаль на грудь ]: "О-о-о!!! Кто оказался наиболее полезным?! Все побежали с вопросом увеличения количества очков ale к модерам!"

ale ★★
()
Ответ на: комментарий от ale

угум-с!
ты только скажи у тебя дальнозоркость или близорукость?
нужно ли антибликовое покрытие, позолоченная оправа?
для тебя попросим что угодно!
;)

FoXy_
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.