Russian Qt Forum
Ноябрь 25, 2024, 00:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: [Лэйауты] Хочется странного  (Прочитано 23452 раз)
SLiDER
Гость
« Ответ #15 : Октябрь 12, 2009, 21:34 »

Сам ты глюк Улыбающийся Читай документацию про geometry. У тебя будут не валидные данные до тех пор пока не отработает цикл событий, а с ним и компановка виджетов через Layout'ы.

Это кто еще из нас глюк  Веселый Может у меня какая-то другая документация, но в ней точно ни где не написано, что если я создал диалог, а затем нажал на нем кнопку в обработчике которой, попытавшись определить текущие координаты диалога, обязательно получу нули, если не попробую его перед этим подвигать или отмасштабировать. Просвятите неграмотного где это написано  Непонимающий
Записан
CroCIV
Гость
« Ответ #16 : Октябрь 13, 2009, 08:26 »

Вот смотрю на Ваши муки и сострадальческие слезы наворачиваются пряма  Плачущий Смеющийся. Вот две минуты заняло, в чем тут проблема ? Дольше компоненты на форму выкидывал.
Держи, не насилуй людям мск  Подмигивающий
Записан
CroCIV
Гость
« Ответ #17 : Октябрь 13, 2009, 08:29 »

если надо, могу сделать в спп, но вечером тока, если не забуду...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Октябрь 13, 2009, 14:51 »

если надо, могу сделать в спп, но вечером тока, если не забуду...
Ну как "надо" - просто интересно, полезно. Если найдете минутку для cpp, не забудьте пожалуйста добавить 2 детальки которые ui (пока) не делает

1) Левая панель должна тоже сайзиться (всегда)

2) Правая панель должна запоминать свой размер и восстанавливать его при следующем show

На разнообразные контролы в правой панели время тратить не нужно.
Спасибо
Записан
CroCIV
Гость
« Ответ #19 : Октябрь 13, 2009, 16:33 »

так я тоже делал, но там все не так просто, там я что-то перекрывал, помоему сайзхинт(), короче сегодня точно не покажу, времени нет совсем, завтра не знаю, и ИМХО не правая панель запоминает свой размер, а вся форма запоминает свои размеры в свернутом и в развернутом состоянии на момент их последнего изменения... а я, кстати, вспомнил, как это примерно делается, размеры еще совал в реестр...
Записан
SABROG
Гость
« Ответ #20 : Октябрь 13, 2009, 22:53 »

Это кто еще из нас глюк  Веселый

Готов признать, что проблема в другом. Дай угадаю, приложение запускается не под Windows. Скорее всего Linux. Документация - http://doc.qt.nokia.com/latest/geometry.html говорит нам, что гарантий нет никаких в этом случае:

Цитировать
X11 provides no standard or easy way to get the frame geometry once the window is decorated. Qt solves this problem with nifty heuristics and clever code that works on a wide range of window managers that exist today. Don't be surprised if you find one where QWidget::frameGeometry() returns wrong results though.

На этом форуме уже был подобный вопрос и пришли к выводу, что надо настраивать свой Windows Manger соответствующим образом. Вроде бы даже есть опция в WM, которая будет любые открываемые окна центрировать на экране, при этом координаты окна будут 0,0.

Попробуй сам центрировать окно.
Записан
SLiDER
Гость
« Ответ #21 : Октябрь 13, 2009, 23:21 »

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

Эммм, Ваша ... ммммм ... штука не то чтобы не работает, но работает не так как надо, могу поспорить, что когда она заработатет так как надо, то выглядеть это решение будет весьма похожим на мой последний вариант. Однако будет весьма занятно взглянуть на еще один варриант решения Улыбающийся Ждем. Реокмендую воспользоваться тестовым проектом, так сказать для унификации.
Записан
SLiDER
Гость
« Ответ #22 : Октябрь 13, 2009, 23:35 »

Это кто еще из нас глюк  Веселый

Готов признать, что проблема в другом. Дай угадаю, приложение запускается не под Windows. Скорее всего Linux. Документация - http://doc.qt.nokia.com/latest/geometry.html говорит нам, что гарантий нет никаких в этом случае:

Цитировать
X11 provides no standard or easy way to get the frame geometry once the window is decorated. Qt solves this problem with nifty heuristics and clever code that works on a wide range of window managers that exist today. Don't be surprised if you find one where QWidget::frameGeometry() returns wrong results though.

На этом форуме уже был подобный вопрос и пришли к выводу, что надо настраивать свой Windows Manger соответствующим образом. Вроде бы даже есть опция в WM, которая будет любые открываемые окна центрировать на экране, при этом координаты окна будут 0,0.

Попробуй сам центрировать окно.

Да, речь идет о Linux и KDE4. Однако приведенная Вами цитата не имеет ни какого оношения к описанной мною проблеме, а говорит о невозможности точно получить так называемую frame-геометрию окна, т.е. размеры окна с учетом декораций которые на него навешивает оконный менеджер, ибо таких менеджеров туева хуча и способы декорирования у всех разные.
З.Ы. Кстати, забавным выглядит тот факт, что стоит сдвинуть или отмасштабировать окно хотя бы на пиксел (все равно как, руками или програмно) метод geometry() (как я уже говорил) начинает возвращать вполне валидные значения, так что похоже всетаки глюк Улыбающийся
Записан
CroCIV
Гость
« Ответ #23 : Октябрь 14, 2009, 12:37 »

Ну я бы сделал как-нибудь так, единственное что мне тут не нравится, это пропорциональное увеличение панелей QSliderа... очень не нравится... хотелось бы, чтобы при растяжении формы, когда видима правая панель, только правая панель и растягивалась бы, а левая свой размер меняло только от действий пользователя.
Жду замечаний
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Октябрь 14, 2009, 13:44 »

Ну я бы сделал как-нибудь так, единственное что мне тут не нравится, это пропорциональное увеличение панелей QSliderа... очень не нравится... хотелось бы, чтобы при растяжении формы, когда видима правая панель, только правая панель и растягивалась бы, а левая свой размер меняло только от действий пользователя.
Жду замечаний
Ну растягивать только правую не вопрос
Код:
splttr->setStretchFactor(0, 0);
splttr->setStretchFactor(1, 1);
А вот когда скрывается правая, видны конвульсии кнопки "Show right" и когда правая открывается - видна лишняя перерисовка. Так что  "не лишено недостатков" (как сказал бы SLiDER  Улыбающийся)
Записан
CroCIV
Гость
« Ответ #25 : Октябрь 14, 2009, 15:11 »

Ну растягивать только правую не вопрос
Код:
splttr->setStretchFactor(0, 0);
splttr->setStretchFactor(1, 1);
Это зачет! )) ваще модно работает.

А вот когда скрывается правая, видны конвульсии кнопки "Show right"
А еще если раздвинуть форму и начать быстро кликать по кнопке, то форма в конце концов ужмется до минсайза  Смеющийся )))
вот патч:
Код:
QSize MyDialog::sizeHint()
{
if (frmRight->isHidden())
return QSize(LWidth,this->height());
else
return QSize(LWidth+RWidth+splttr->handleWidth(),this->height());
}

и когда правая открывается - видна лишняя перерисовка. Так что  "не лишено недостатков" (как сказал бы SLiDER  Улыбающийся)
ниче такого не наблюдаю  В замешательстве
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Октябрь 14, 2009, 15:55 »

      return QSize(LWidth+RWidth+splttr->handleWidth(),this->height());
А чем это отличается от того что сформулировал SLiDER - аккуратно подсчитать размер с учетом всех спейсов лайаута? Только тем что на 3 члена класса больше?  Улыбающийся 
Записан
SLiDER
Гость
« Ответ #27 : Октябрь 14, 2009, 20:37 »

Вот такая вот красота с Вашим CroCIV вариантом у меня получается, не слишком красиво  Подмигивающий
Записан
CroCIV
Гость
« Ответ #28 : Октябрь 15, 2009, 07:53 »

А чем это отличается от того что сформулировал SLiDER - аккуратно подсчитать размер с учетом всех спейсов лайаута? Только тем что на 3 члена класса больше?  Улыбающийся 
ну я и не говорил, что будет совсем по другому, я говорил, что делал такое(похожее), а щас реализовал с использованием слайдера, и поведение формы, на мой взгляд самое адекватное.

Вот такая вот красота с Вашим CroCIV вариантом у меня получается, не слишком красиво  Подмигивающий
тут необходимо играться с
Код:
void MyDialog::sltBtnLeft()
{
...
if (...)
{
....
this->setMinimumWidth(100); <- ну по образу и эту можно подправить
}
else
this->setMinimumWidth(200); <- вот с этой штукой
...
просто минимальная ширина формы не может быть меньше суммы минимальных ширин видимых панелей, а в даннмо случае на сколько я вижу отсюдава ширину левой панели задает кнопка с соответствующими отступами... это так-то трабла, если кол-во элементов и их размеров на панелях заведо не известно  В замешательстве
Записан
CroCIV
Гость
« Ответ #29 : Октябрь 15, 2009, 07:59 »

о а вот и не проблема, вот патч
Код:
MyDialog::MyDialog(QWidget* parent, Qt::WindowFlags flags)
      : QDialog(parent, flags)
{
...
  loMain->setSizeConstraint(QLayout::SetMinimumSize);
...
}

Код:
void MyDialog::sltBtnLeft()
{
LWidth=frmLeft->width();
if (frmRight->isVisible())
RWidth=frmRight->width();
    frmRight->setVisible(frmRight->isHidden());
this->resize(this->sizeHint());
splttr->setSizes(QList<int>()<<LWidth<<RWidth);
}
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.222 секунд. Запросов: 22.