Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: darktroll от Июнь 17, 2010, 12:42



Название: Изменение положения QSplitter программным путем.
Отправлено: darktroll от Июнь 17, 2010, 12:42
Есть QSplitter. Он разделяет два компонента, но это не суть. Меня интересует, можно ли программным путем изменить его положение (подвинуть леве-правее так, как бы это делалось путем его "перетаскивания")?
У него есть сигнал, которым можно увидеть его положение относительно формы при перетаскивании: splitterMoved (int pos, int index).
Что интересно, он передает 2 целочисленных значения.
Чтож, создаю этот сигнал. Он передает эти значения в функцию test(pos, index), которая выводит на экран каждое изменение этих параметров:
Код
Python
QtCore.QObject.connect(splitter, QtCore.SIGNAL('splitterMoved(int, int)'), self.test)
 
def test(pos, index):
print pos
print index
 

При перемещении сплиттера руками получаю в консоли что-то типа:
Код
Python
<__main__.TestProg object at 0x9d7c46c>
100
<__main__.TestProg object at 0x9d7c46c>
110
<__main__.TestProg object at 0x9d7c46c>
120
 
Что такое 100,110,120 - это понятно. Это index - перемещение сплиттера. А вот почему вмсето второго целочисленного значения выводится <__main__.TestProg object at 0x9d7c46c> - не пойму. Но это меня мало волнует.

ВОПРОС: Можно ли программно задавать этот самый index, тем самым перемещая сплиттер?

Раз уж есть сигнал, позволяющий отлавливать перемещение, то по идее должна быть и функция, позволяющая изменять положение сплиттера. Но я такой не нашел....


Название: Re: Изменение положения QSplitter программным путем.
Отправлено: GreatSnake от Июнь 17, 2010, 12:52
Цитировать
Можно ли программно задавать этот самый index, тем самым перемещая сплиттер?
Из Python-а скорее всего так не получится, т.к. есть QSplitter::moveSplitter( int pos, int index ), но он protected.
Но мне кажется, вы заходите не с того конца, т.к. логичнее было бы изменить размеры компонентов.


Название: Re: Изменение положения QSplitter программным путем.
Отправлено: darktroll от Июнь 17, 2010, 12:56
Из Python-а скорее всего так не получится, т.к. есть QSplitter::moveSplitter( int pos, int index ), но он protected.
Да, видел ее. Но работает она как-то странно. Чтобы ей не передавал в параметрах, оно смещает сплиттер в право до предела.
Что-то здесь с параметром pos не то, имхо.... Тип мне его не нравится....
Но мне кажется, вы заходите не с того конца, т.к. логичнее было бы изменить размеры компонентов.
Хм, а я и не подумал.... Спасибо, попробую!  ;)


Название: Re: Изменение положения QSplitter программным путем.
Отправлено: darktroll от Июнь 17, 2010, 13:13
Хм, не получается....
Как ни задавай размеры - ничего не происходит.
Пробовал в дизайнере. Создавал два виджета, разделял их сплиттером. Своиство geometry в дизайнере вообще становится серым и не доступным для любого из виджетов. Бред....
Если менять размеры у самого сплиттера, то он увеличивает/уменьшает каждый компонент одинаково, "поровну".


Название: Re: Изменение положения QSplitter программным путем.
Отправлено: GreatSnake от Июнь 17, 2010, 13:15
QSplitter::setSizes ( const QList<int> & list )


Название: Re: Изменение положения QSplitter программным путем.
Отправлено: darktroll от Июнь 17, 2010, 14:17
Да, размеры оно меняет, но я в упор не пойму, по какому закону. Вот у меня 2 виджета, разделенных сплиттером. Сколько мне параметров надо задать в setSizes и каких, чтобы, например, получить отношение длинн виджетов 1:3? Есть зависимость от конкретных размеров формы?


Название: Re: Изменение положения QSplitter программным путем.
Отправлено: Crazy Sage от Июнь 17, 2010, 14:55
в списке для setSizes должно быть столько же элементов, сколько виджетов в сплиттере, после чего он им поставит размеры по списку. Удобно вначале сделать getSizes, потому что при попытке изменить суммарную длину\ширину могут начаться глюки.


Название: Re: Изменение положения QSplitter программным путем.
Отправлено: darktroll от Июнь 17, 2010, 21:42
Спасибо большое за пояснения! Буду пробовать.  ;)