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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Установка положения QSplitter  (Прочитано 7684 раз)
m0rph
Гость
« : Август 18, 2011, 10:16 »

Установка начального положения QSplitter - весьма больная тема. Через QtDesigner этого сделать по сути невозможно, хотя есть одна хитрость. Насколько я понял его логику работы, большое значение имеют свойства виджетов, объединяемых сплиттером ДО самого факта объединения. Т.е. их размеры, политики изменения размеров, а так же Horizontal Stretch / Vertical Stretch учитываются дизайнером ТОЛЬКО в момент объединения. Изменение этих параметров у виджетов, уже объединенных сплиттером приводят к самым непредсказуемым результатам.
Теперь перейдем непосредственно к коду. Казалось бы, сделать вызов
Код:
splitter->setSizes(QList<int>() << firstSize << secondSize) 
не составляет труда и все должно быть замечательно. Но и тут не обходится без сюрпризов. Если до/после вызова setSizes установить stretch factor'ы
Код:
splitter->setStretchFactor(0, 0);
splitter->setStretchFactor(1, 1);
получаем опять непредсказуемое положение сплиттера.
Ну а теперь собственно вопрос: Есть задача, установить горизонтальный сплиттер в определенную позицию (в пикселах). Так же необходимо отключить изменение размеров виджета слева от сплиттера при изменении размеров окна (т.е. установить stretch factor'ы, как показано в коде выше). Каким образом можно получить желаемый результат?
Записан
asvil
Гость
« Ответ #1 : Август 18, 2011, 10:50 »

отключить изменение размеров виджетов можно с помощью maximumWidth/Height.
Записан
ddrtn
Гость
« Ответ #2 : Август 18, 2011, 11:29 »

Обрати внимание на QSplitter::saveState()/QSplitter::restoreState(). При первом запуске, конечно, положение будет какое получится, зато потом состояние будет куда-нибудь сохраняться (я сохраняю в инишку).
Записан
m0rph
Гость
« Ответ #3 : Август 18, 2011, 13:46 »

отключить изменение размеров виджетов можно с помощью maximumWidth/Height.
Безусловно можно, но ненужно. Ограничение размеров виджетов нежелательно.

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

Судя по всему на текущий момент бзе применения workaround'ов задача не решаема.
Записан
ddrtn
Гость
« Ответ #4 : Август 18, 2011, 13:53 »


Фактически это такой же workaround (костыль), как и предыдущий метод, т.к. задача именно в точной установке положения сплиттера.

Почему костыль? Первый рас запускается абы как зря, зато потом - точно как нужно пользователю.
Чтобы первый запуск сделать красиво - можно поиграться свойством sizePolicy виджетов, объединенных сплиттером, установив минимальные размеры одного из виджетов (можно обоих)
Записан
m0rph
Гость
« Ответ #5 : Август 18, 2011, 15:06 »

Почему костыль? Первый рас запускается абы как зря, зато потом - точно как нужно пользователю.
Чтобы первый запуск сделать красиво - можно поиграться свойством sizePolicy виджетов, объединенных сплиттером, установив минимальные размеры одного из виджетов (можно обоих)
Предположим требуется установить спиттер ТОЧНО в произвольную позицию в любой момент времени, а не только при повторном запуске. Речь идет об управлении положением сплиттера, а не о установке его на глазок в некоторое приемлимое положение с последующим сохранением предпочтений пользователя. Да, задача притянута за уши, но она то как раз и не решаема.
Записан
asvil
Гость
« Ответ #6 : Август 18, 2011, 15:35 »

О человек сам говорит, что задает глупый вопрос, похвально.
Записан
ddrtn
Гость
« Ответ #7 : Август 18, 2011, 15:40 »

QSplitter собственно и нужен для ручного управления расстановкой виджетов на родительском виджете.
Вообще, при работе с лэйоутами как-то не принято оперировать координатами виджетов. но можно попробовать
QSplitterHandler::move();
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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