Название: Установка положения QSplitter Отправлено: m0rph от Августа 18, 2011, 10:16 Установка начального положения QSplitter - весьма больная тема. Через QtDesigner этого сделать по сути невозможно, хотя есть одна хитрость. Насколько я понял его логику работы, большое значение имеют свойства виджетов, объединяемых сплиттером ДО самого факта объединения. Т.е. их размеры, политики изменения размеров, а так же Horizontal Stretch / Vertical Stretch учитываются дизайнером ТОЛЬКО в момент объединения. Изменение этих параметров у виджетов, уже объединенных сплиттером приводят к самым непредсказуемым результатам.
Теперь перейдем непосредственно к коду. Казалось бы, сделать вызов Код: splitter->setSizes(QList<int>() << firstSize << secondSize) Код: splitter->setStretchFactor(0, 0); Ну а теперь собственно вопрос: Есть задача, установить горизонтальный сплиттер в определенную позицию (в пикселах). Так же необходимо отключить изменение размеров виджета слева от сплиттера при изменении размеров окна (т.е. установить 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(); |