Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Varan от Январь 13, 2009, 18:08



Название: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: Varan от Январь 13, 2009, 18:08
Вопрос, думаю, простой, но я не знаю, как его задать в поиске, поэтому:

Qt 4.4. На главной форме есть dockWidget, а на нем два QFrame в вертикальном Layout. Надо, чтобы при нажатии спец.кнопки один фрейм делался невидимым, а второй - видимым, а при отжатии - наоборот.
Если делать setVisible для одного и другого по очереди один за другим, то момент, когда один уже нарисован, а второй еще не убран, очень заметен. Есть ли какие-то операторы, чтобы отрисовка происходила только по завершению всей последовательности изменений типа setVisible?


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: BaltikS от Январь 13, 2009, 18:21
Честно говоря не понятно о каких артефактах идёт речь...
Повторил всё в дизайнере связал сигнал toggled(bool) со слотами setShown(bool) и setHidden(bool), сделал Preview и всё работает как надо... Как всегда телепатов нет и нужен код  ;)


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: lit-uriy от Январь 13, 2009, 18:24
Функция setUpdatesEnabled,
Но можно и виджеты положить на QStackedLayout


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: pastor от Январь 13, 2009, 18:41
Но можно и виджеты положить на QStackedLayout

+1


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: Varan от Январь 13, 2009, 18:49
А StackedWidget Для StackedLayout не обязательно делается? А то в designer обнаружил только StackedWidget, а это мне не подойдет.

насчет двух сигналов это я не думал, я просто подряд делал.
Код
C++ (Qt)
bool isEditModeOn = ui.acEditMode->isChecked();
ui.frmEditTools->setVisible(isEditModeOn);
ui.frmWorkTools->setVisible(!isEditModeOn);

И еще вопрос: а setUpdatesEnabled для чего нужно вызывать?


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: lit-uriy от Январь 13, 2009, 19:07
И еще вопрос: а setUpdatesEnabled для чего нужно вызывать?
для виджета, в котором нужно временно запретить обновление, фактически обрамляешь кусок кода двумя вызовами:
setUpdatesEnabled(false)
...
большие обновления
...
setUpdatesEnabled(true)


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: lit-uriy от Январь 13, 2009, 19:15
А StackedWidget Для StackedLayout не обязательно делается? А то в designer обнаружил только StackedWidget, а это мне не подойдет.
насчет того, что для кого не обязательно делается я не понял. Ты можешь применить QStackedWidget. Возможно что тебя в дизайнере кнопки листания в этом виджете смутили. Их не будет в реальности они для удобства работы в дизайнере. Проверь сам: меню "Form" -> "Preview"


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: Varan от Январь 13, 2009, 20:16
для виджета, в котором нужно временно запретить обновление, фактически обрамляешь кусок кода двумя вызовами:
setUpdatesEnabled(false)
...
большие обновления
...
setUpdatesEnabled(true)
пробовал для dockWidget, не сработало. Надо для главного окна? setUpdatesEnabled - это же не глобальная функция, а член класса, там надо что-то впереди написать ИМХО.

асчет того, что для кого не обязательно делается я не понял. Ты можешь применить QStackedWidget. Возможно что тебя в дизайнере кнопки листания в этом виджете смутили. Их не будет в реальности они для удобства работы в дизайнере. Проверь сам: меню "Form" -> "Preview"
Посмотрел, кнопки листания есть :). Плюс он уменьшает ширину того, что в нем находится.


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: ритт от Январь 13, 2009, 21:25
пользуй QStackedLayout и не смеши народ.
по setUpdatesEnabled() читай ассистант там всё есть!


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: SABROG от Январь 13, 2009, 22:35
Qt 4.4. На главной форме есть dockWidget, а на нем два QFrame в вертикальном Layout.

Я правильно понимаю, есть DockWidget, который является parent'ом для двух QFrame'ов, каждый из которых лежит на общем QVBoxLayout (вертикальный Layout). Т.е. друг над другом не перекрывая друг друга и в разные моменты виден либо верхний либо нижний фрейм и позиции их и размеры должны быть фиксированными?


Название: Re: Как избежать артефактов при цепочке изменений интерфеса?
Отправлено: Varan от Январь 14, 2009, 23:42
Я правильно понимаю, есть DockWidget, который является parent'ом для двух QFrame'ов, каждый из которых лежит на общем QVBoxLayout (вертикальный Layout). Т.е. друг над другом не перекрывая друг друга и в разные моменты виден либо верхний либо нижний фрейм и позиции их и размеры должны быть фиксированными?
Сильно понимаю, что щас меня будут бить, но сразу говорю - я запихнул всё только в один фрейм и рад невозможно. Поэтому практическая сторона вопроса отпала.
А касаемо того, что было - да, только Layout делался не как отдельный объект в designer, а через меню Form. Просто про StackedLayout я не знал и попробовал сделать так. Как оказалось, фреймы действительно начали становиться на одно и то же место, но не без огрехов, которые я и пытался описать.
Спасибо за вашу отзывчивость.