Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: npopok от Февраль 11, 2009, 11:47



Название: setFixedSize() и реальные размеры.
Отправлено: npopok от Февраль 11, 2009, 11:47
Как пример, мне надо получить квадратное окно на всех разрешениях экрана с помощью setFixedSize(), на всех мониторах, короче в любых условиях.
Не могу этого добиться.Пробовал в зависимости от разрешения подбирать коэффициенты,подобрал, но на широкоформатных мониторах трюк не прошел.
К тому же коэффициенты получились странные ,и нет у меня уверенности, что в других условиях все будет работать правильно.
В общем, как считаются реальные размеры?Это зависит от видеокарты?нужно именно setfixedsize и коэффициенты,любые другие варианты-только в случае невозможности первого.


Название: Re: setFixedSize() и реальные размеры.
Отправлено: ритт от Февраль 11, 2009, 11:52
а разве setFixedSize(QSize(300, 300)) не сделает окно квадратным (+декорации)?


Название: Re: setFixedSize() и реальные размеры.
Отправлено: npopok от Февраль 11, 2009, 11:54
нет не делает


Название: Re: setFixedSize() и реальные размеры.
Отправлено: BRE от Февраль 11, 2009, 11:57
Как подбираешь коэффициенты?

Посмотри на QPaintDevice.
Он возвращает размеры сторон в логических координатах и в мм.
На основании этого можно попробовать посчитать коэффициенты.


Название: Re: setFixedSize() и реальные размеры.
Отправлено: ритт от Февраль 11, 2009, 11:59
тогда курить QPaintDevice про dpi


Название: Re: setFixedSize() и реальные размеры.
Отправлено: Rcus от Февраль 11, 2009, 12:46
Все же хотелось бы узнать для начала что именно не работает? У меня /*WinXP + Qt450ss-20081217; разрешение 1680x1050*/ все нормально устанавливается


Название: Re: setFixedSize() и реальные размеры.
Отправлено: npopok от Февраль 11, 2009, 13:23
Описать вкратце реальное приложение и проблемы, связанные с ним, просто слов не подобрать.
Создал тестовое приложение виндовс куте 4.2.2
QWidget*w = new QWidget();
w->setFixedSize(QSize(200,200));
w->show();
мерею линейкой получившийся квадрат.высота заметно больше длины.Для начала мне надо убрать хотя бы это.дальше уж разберусь.


Название: Re: setFixedSize() и реальные размеры.
Отправлено: Rcus от Февраль 11, 2009, 13:25
Не знаю что вы именно измеряете /*подозреваю что по краю видимого фрейма*/. Возможно поможет http://doc.trolltech.com/4.4/geometry.html


Название: Re: setFixedSize() и реальные размеры.
Отправлено: npopok от Февраль 11, 2009, 13:47
я измеряю clientArea в мм.и получаю примерно 6,5 на 7 см.Когда там будет картинка-она растянется по вертикали и будет некрасивой.
если написать .
w->setFixedSize(QSize(200*xDsp/(1.25*yDsp),200)); то получается квадрат. xDsp, yDsp- разрешение экрана.
Но на широкоформатном мониторе квадрат вновь превращается в прямоугольник, да и откуда взялась 1.25 я не знаю, а знать обязан.


Название: Re: setFixedSize() и реальные размеры.
Отправлено: npopok от Февраль 11, 2009, 14:56
В общем ситуация прояснилась,но легче не стало.
Оказалось, что у меня монитор не 4:3 а 5:4 и на разрешении 1280:1024(5:4)получается квадрат, а при 1024:768(4:3)-прямоугольник.Соответственно, чтобы правильно отображать, мне надо знать как соотносятся стороны монитора(рекомендуемое разрешение) и текущее разрешение.текущее я знаю, а как узнать рекомендованное?


Название: Re: setFixedSize() и реальные размеры.
Отправлено: Rcus от Февраль 11, 2009, 15:34
ааааааа то есть вы хотите компенсировать искажение изображения при использовании разрешения с неродным соотношением сторон? :) /*sigh of relief*/ Врядли это возможно средствами Qt, да и смысл: все равно даже если ваше окно будет квадратным все остальное пространство будет искажено


Название: Re: setFixedSize() и реальные размеры.
Отправлено: npopok от Февраль 11, 2009, 15:49
можно бы было забить.да вот проблема.люди, принимающие программу, ничего не понимают и им глубоко плевать, должно смотреться.а у них как на зло  мониторы 5:4 с разрешением 1024:768. смотрится это,кстати,нормально.я и не знал, что у меня не рекомендованное разрешение стоит.А делать только под них естественно нельзя(
Ведь видеокарта это рисует!она знает!у нее спросить надо.только вот я с ней не знаком(


Название: Re: setFixedSize() и реальные размеры.
Отправлено: Rcus от Февраль 11, 2009, 16:05
Подождите ка. Если на мониторе с соотношением сторон 5:4 установить разрешение 4:3 то он будет либо искажать картинку (у меня так ругается 20" LG при установке 1920x1080 при родных 1680x1050), либо оставлять неиспользуемое пространство


Название: Re: setFixedSize() и реальные размеры.
Отправлено: npopok от Февраль 11, 2009, 16:30
конкретно монитор flatron l1753s является 5:4, но 1280 на 1024 мне мелко.работаю 1024 на 768.
он искажает, но выглядит это вполне прилично.я и не знал, что он искажает
Все, что я пока нашел это функция winapi EnumDisplaySettings, способная вернуть  все возможные разрешения. я так понимаю, что самое большое является оптимальным. по нему можно высчитать.но это такой опасный финт ушами...
Может так сделать?или искать дальше?
Может в qt что-нибудь типа-того есть?


Название: Re: setFixedSize() и реальные размеры.
Отправлено: BRE от Февраль 11, 2009, 16:58
Берем widget, делаем ему resize( 100, 100 );

Смотрим, что выводят следующие методы класса QPaintDevice, от которого, кстати, наследуется QWidget:
Код
C++ (Qt)
qDebug() << "Width  =" << width() << "pix " << widthMM() << "mm" << '\n'
<< "Height =" << height() << "pix " << heightMM() << "mm";
 

Цитировать
Width  = 100 pix  24 mm
 Height = 100 pix  22 mm

Думаем...
Считаем 24 / 22 = 1,(09)

Делаем resize( 100, 100 * 1,09 );

Смотри:
Цитировать
Width  = 100 pix  24 mm
 Height = 109 pix  24 mm


Название: Re: setFixedSize() и реальные размеры.
Отправлено: npopok от Февраль 11, 2009, 17:37
это я попробовал в первую очередь.получил
setFixedSize(200,200);получил  66 66
setFixedSize(300,300);получил  99 99
сейчас попробовал ваши setFixedSize(300,300) неожиданно получил 38 33
обалдел.но 38/33 -неправильный коеффициент.




Название: Re: setFixedSize() и реальные размеры.
Отправлено: vdann от Февраль 11, 2009, 17:47
...setFixedSize(...) => размеры в пикселях!!!, а они не всегда квадратные, с такими проблемами сталкиваются когда например на любом устройстве (на разных) нужно рисовать в своих условных единицах (пр. мм):   
Код
C++ (Qt)
// добавил в конструктор
 
// те размеры которые тебе нужны (в мм)
double newWidth = 100;
double newHeight = 100;
 
QDesktopWidget dw;
QWidget* w = dw.screen();
 
// размеры устройства
double dmWidth = w->width();
double dmHeight = w->height();
double dmWidthMM = w->widthMM();
double dmHeightMM = w->heightMM();
 
qDebug() << dmWidth;
qDebug() << dmHeight;
qDebug() << dmWidthMM;
qDebug() << dmHeightMM;
 
// разрешение (по высоте и ширине возможно разное)
double resolutionWidth = dmWidthMM / dmWidth;
double resolutionHeight = dmHeightMM / dmHeight;
 
qDebug() << resolutionWidth;
qDebug() << resolutionHeight;
 
// новые размеры в пикселях
newWidth /= resolutionWidth;
newHeight /= resolutionHeight;
 
qDebug() << newWidth;
qDebug() << newHeight;
 
setFixedSize(newWidth, newHeight);
 

..размер окна у тебя всегда будет фиксированный, если переопределить QWidget::resizeEvent( QResizeEvent * event ) и там таким же способом вычислять размер, то окно у тебя будет растягиваться визуально "квадратно" на любом мониторе.


Название: Re: setFixedSize() и реальные размеры.
Отправлено: npopok от Февраль 12, 2009, 10:53
а вы сами этот код пробовали на нештатном разрешении?
не знаю как у вас, но у меня widthMM() и heightMM() по факту  своему названию не соответствуют


Название: Re: setFixedSize() и реальные размеры.
Отправлено: vdann от Февраль 12, 2009, 12:37
...работаю на жк мониторе, до этого пользовался этим не задумывался,
сейчас пробовал:
- разрешение монитора совпадает с тем разрешением, которое формирует ОС, всё как по линейке (мерил);
- разрешение монитора не совпадает с тем разрешением, которое формирует ОС, по вертикали все нормально, а по горизонтали нет (размер экрана widthMM() в мм 360, а по линейке 436).
После этого попробовал ЭЛТ, там на разных разрешениях разница 1-2 мм, возможно изменяется толщина рамки виджета.
В крайнем случае размер экрана можно попробовать получать функциями API ОС.


Название: Re: setFixedSize() и реальные размеры.
Отправлено: ритт от Февраль 13, 2009, 06:20
Код
C++ (Qt)
int w, h;
w = h = 750;
QDesktopWidget* dw = qApp->desktop();
qreal factor = dw->width() / dw->height();
h /= factor;
 
QWidget* widget = new QWidget;
wdget->setFixedSize(w, h);
 

элт-шки у меня нет - проверить не могу.