Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Caduceus от Сентября 11, 2009, 11:18



Название: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 11:18
В редакторе виджеты которые в сплиттере одинаковой ширины. Запускаю программу - правое узэнькое-узэнькое. Почему так?


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 11:41
И еще вопрос вдогонку. Как сделать чтобы в этом гребаном редакторе, когда делаешь например лайоут формы VertialLayout, чтобы он не расфигачивал по одинковым не изменяющим размер полочкам все виждеты на форме. Достало уже.

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


PS Блин, ну что за говно. Все прыгает, уменьшается в пикслеь, не ресайзится. Есть хоть один лайоут резиновый, который самому подправить можно или с овсеми такая жопа?


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 11:50
1) size policy поковыряй.
2) так и надо как бы. Пробуй грид и спейсеры. Возможно форм лайаут еще будет в тему
3) tab widget?
лайауты для того и нужны, чтобы раскладывать виджеты по определенным правилам. Можешь попробовать программно прятать лишние виджеты, либо удалять/добавлять их из лайаута когда надо, но лучше таб виджет
added: про спейсер понял о чем ты) выглядит как бага, но надо глядеть как будет в программе, потому что класс для отображения  .ui'шки может действительно слегка отличаться (возможно что "бага" как раз в классе дизайнера). Вообще размер задается через QSplitter::setSizes ( const QList<int> & list ), если я правильно понял докуметацию.


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 12:08
Все. пошел убивать себя ап стену. Видима моя задача слишком проста для "мощного, гибкого и удобного" механиза размещения контролов Qt.

Он бля такой супер-умный, и ширину-то раздвигает при смене языков и все зашибись. Нахера он спрашивается уебывает размер в ноль при задании лайоута. В WTL бля и то все понятнее.


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 12:12
задачу обрисуй и без мата, если можно...


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 12:19
Да как же тут без мата-то...

Задача проста. Сделать компоновку в дизайнере, чтоб после запуска было бы тоже что и в дизайнере. Программно...нафига они тогда дизайнер вообще делали...

Лайоут такой. Окно. Всю ег оосновную часть занимает сплиттер с двумя виджетами слева и справа. В дизайнере все зашибись - все одинаково, после заупска правый уменьшается пикслей до 100 в ширине. Ну это ладно, как бы. Это не бесит и не вызывает мата.

Проблема в другом. Под этим сплиттером должен быть таб. И я кидаю таб. Но таб кастомный и он заполняется виджетами с самой формы. Поэтому виджеты для таба я тоже кидаю на основную форму. Все. Кинул нормально.

Но!!!! Надо задать ЛАЙОУТ всей формы, чтобы при ресайзе все нормально двигалось... И тут начинается.  То он все в ноль уфигачиает куда-то в угол. То все рановмерно раскладывает, то максимайзит на все окно не то что надо. Короче, сделать как мне надо - НЕВОЗМОЖНО, я так понял...


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 12:31
поглядел в реальной программе, сплиттер - походу баг именно дизайнера (вообще так быть не должно - что размеры виджета заданные руками, влияют на компоновку. Исключение - minimumExpanding, но тебе он не подойдет)
теперь таб - делаешь TabWidget, в них кидаешь нужные тебе виджеты, и программно прячешь ненужные (не пробовал, но должно сработать)


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 12:34
А лайоут всей формы-то какйо делать? Проблемы наичнаются именно с попыток задания лайоута формы.


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 12:42
так в том-то и дело, что не важно, у тебя "динамические" виджеты должны быть упрятаны внутрь таба, ведь так? я использовал грид лайаут, но можно и вертикальный
у меня получилось что-то типа такого (на форме есть еще 2 виджета, коих сейчас не видно):


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 12:44
А можешь сделать нижний таб примерно 1/5 всего окна внизу?

Я ставил грид, он таб расфигачивает на все окно и то что мне надо узенькой полоской наверху.


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 12:51
Вот что у меня. Полосочка выделенная наверху - это то что должно быть на все окно (сплиттер) и в программе так и есть. Этот градлинетный - это один из табов. Какого х... он его расфигачил на все окно - загадка.


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 13:02
форму (.ui файл) выложи:) кажись знаю, где трабла... размеры ковырял?
вот тебе урезанный низ (правда он через 1 место сделан)


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 13:07
Да размер ковырял. Пытался хоть как-то угомонить эти максимизирущиеся виджеты и ставил максимумы высоты в 200 пикслелй. Пофигу. Вот что у меня. Если менять лайоут формы - толку не много, все арвно поулчается лажа, которую нельзя поправить


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 13:15
по-моему тебе нужны спейсеры:)


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 13:20
Добавил так спйсеры. В дизайнере по-прежнему главная часть окна узкой полоскорй наврерху, потом вниз половина занята спйсером, потом то что в табах


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 13:24
там, где спейсер тебе нужно либо а) другой виджет
б) поставить мин размер спейсеру по вертикали


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 13:26
Хмм, ща буду пробовать со спейсерами. В любом случае - большое спасибо за помощь. Поковыряюсь еще пару часиков, если не полчится, забью нахер на эти дизайнеры и буду все руками программить


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 13:33
А можешь кинуть ui твоей второй картинки? и что за "правда он через 1 место сделан"? Какое место?


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 13:36
http://www.prog.org.ru/index.php?topic=10591.msg63524#msg63524 (http://www.prog.org.ru/index.php?topic=10591.msg63524#msg63524)


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: SABROG от Сентября 11, 2009, 13:43
Вот что у меня. Полосочка выделенная наверху - это то что должно быть на все окно (сплиттер) и в программе так и есть. Этот градлинетный - это один из табов. Какого х... он его расфигачил на все окно - загадка.

А у меня совсем другая картина:

Qt 4.5.2

(http://img222.imageshack.us/img222/91/layoutsx.png)


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 14:21
Короче, резюме. Уебище этот суперский Qt шный дизайнер


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 14:24
руки, всё руки... просто кидать QWidget (который по умолчанию лишь базовый класс для элементов) на форму и с ним экспериментировать глупо. Хз, зачем к примеру 2 QWidget'а в сплиттер кидать


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: SABROG от Сентября 11, 2009, 14:26
Короче, резюме. Уебище этот суперский Qt шный дизайнер

Я например так и не понял как ты хочешь сделать. Размести что ли элементы без лэйаутов и выложи картинку.

А пропорции 1/5 задаются через stretchFactor.


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 14:32
Задавал я этот StrechFactor в том же сплите. 1:1 оба виджета. Ну не делает он так, хоть убейся


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 14:37
ну сейчас разговор не про сплиттер, а про грид


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 14:41
Ух ты, это то что надо. Черт. Как ты это сдалал? Спейсеров нету. ТОлько вот таб не как у меня. У меня как раз табовские виджеты все портятя


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 14:44
я сделал то, что сказал SABROG:)
спейсер есть вверху - между лейблом и listWidget
а на centralWidget установлен GridLayout для понимания гляди скриншот (когда ты добавляешь виджету layout, у него в свойстах появляются настройки этого layout'a - красные поля на скрине. Выделенное поле задает пропорции грида по вертикали)


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 14:47
А черт, точно.

СПАСИБО!!!!!!!

Хе-хе, в дизайнере VisualStudio этими полями и не пахнет...


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Caduceus от Сентября 11, 2009, 14:52
Добился более-менее одинаковых ширин в слиттере - это если одному виджету поставить 5 в горизонтальном растягивании, а другому - 8. То получаются одинаковые. Идиотизм


Название: Re: Как сделать сплиттер по-умлочанию равноширинным?
Отправлено: Авварон от Сентября 11, 2009, 19:54
думается это из-за того, что
Цитировать
void QSplitter::setStretchFactor ( int index, int stretch )

Updates the size policy of the widget at position index to have a stretch factor of stretch.

stretch is not the effective stretch factor; the effective stretch factor is calculated by taking the initial size of the widget and multiplying it with stretch.