Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: m0rph от Август 18, 2011, 10:16



Название: Установка положения QSplitter
Отправлено: 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'ы, как показано в коде выше). Каким образом можно получить желаемый результат?


Название: Re: Установка положения QSplitter
Отправлено: asvil от Август 18, 2011, 10:50
отключить изменение размеров виджетов можно с помощью maximumWidth/Height.


Название: Re: Установка положения QSplitter
Отправлено: ddrtn от Август 18, 2011, 11:29
Обрати внимание на QSplitter::saveState()/QSplitter::restoreState(). При первом запуске, конечно, положение будет какое получится, зато потом состояние будет куда-нибудь сохраняться (я сохраняю в инишку).


Название: Re: Установка положения QSplitter
Отправлено: m0rph от Август 18, 2011, 13:46
отключить изменение размеров виджетов можно с помощью maximumWidth/Height.
Безусловно можно, но ненужно. Ограничение размеров виджетов нежелательно.

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

Судя по всему на текущий момент бзе применения workaround'ов задача не решаема.


Название: Re: Установка положения QSplitter
Отправлено: ddrtn от Август 18, 2011, 13:53

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

Почему костыль? Первый рас запускается абы как зря, зато потом - точно как нужно пользователю.
Чтобы первый запуск сделать красиво - можно поиграться свойством sizePolicy виджетов, объединенных сплиттером, установив минимальные размеры одного из виджетов (можно обоих)


Название: Re: Установка положения QSplitter
Отправлено: m0rph от Август 18, 2011, 15:06
Почему костыль? Первый рас запускается абы как зря, зато потом - точно как нужно пользователю.
Чтобы первый запуск сделать красиво - можно поиграться свойством sizePolicy виджетов, объединенных сплиттером, установив минимальные размеры одного из виджетов (можно обоих)
Предположим требуется установить спиттер ТОЧНО в произвольную позицию в любой момент времени, а не только при повторном запуске. Речь идет об управлении положением сплиттера, а не о установке его на глазок в некоторое приемлимое положение с последующим сохранением предпочтений пользователя. Да, задача притянута за уши, но она то как раз и не решаема.


Название: Re: Установка положения QSplitter
Отправлено: asvil от Август 18, 2011, 15:35
О человек сам говорит, что задает глупый вопрос, похвально.


Название: Re: Установка положения QSplitter
Отправлено: ddrtn от Август 18, 2011, 15:40
QSplitter собственно и нужен для ручного управления расстановкой виджетов на родительском виджете.
Вообще, при работе с лэйоутами как-то не принято оперировать координатами виджетов. но можно попробовать
QSplitterHandler::move();