Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Июль 03, 2011, 16:52



Название: Что-то я в QTabWidget запутался...
Отправлено: Гурман от Июль 03, 2011, 16:52
Есть такая структура:

Код:
centralWidget
    horizontalLayout
         listWidget // в левой половинке layout
         tabWidget // в правой половинке layout
               tab1
                     textEdit1
               tab2
                     textEdit2
то есть, как бы понятно - слева список, справа табы с открытыми документами из списка

однако все никак не получается синхронизировать изменение размеров tabWidget и вложенного в него textEdit с изменением размеров окна

в коде конструктора окна, разумеется, есть

Код:
setCentralWidget( ui->horizontalLayoutWidget );

и listWIdget совершенно нормально себя ведет, но tabWidget почему-то нет, он не хочет меняться вместе с окном, но только почему-то по вертикали - горизонтальная нижняя граница таба не перемещается вниз за окном, при изменении по вертикали, но при изменении окна по горизонтали... таб явно меняется вместе с окном  :-\

политики ресайза у второго таба обе Expanded, максимальные размеры не ограничены

а если внутрь этого таба кладу textEdit, то он вообще за табом не следует, и ничего не помогает - я уже внутри таба и QHBoxLayout клал, и в него текст потом - все равно не помогает

как это побороть в дизайнере, не хочется сигналы изменения размеров подключать

кстати, далее табы с текстами будут добавляться динамически, и мне бы надо понять, как им при создании указывать, чтобы они все ресайзились за окном

или может просто по воскресеньям работать не надо...


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: kambala от Июль 03, 2011, 17:28
набросал в дизайнере такой же виджет - всё правильно меняется: таб 1 без лейаута - текстэдит стоит на месте, таб 2 с лейаутом - текстэдит меняется вместе с окном.


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: Гурман от Июль 03, 2011, 17:39
делаю так:

Код:
centralWidget
    horizontalLayout
         listWidget // в левой половинке layout
         tabWidget // в правой половинке layout
               tab1
                     verticalLayout1
                          textEdit1
               tab2
                     verticalLayout2
                          textEdit2

нифига - размер текста за окном не меняется

что не так?


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: kambala от Июль 03, 2011, 17:42
посмотри прикрепленный файл в предыдущем посте - у меня там такая же структура, может что-то подскажет.

может у табвиджета статический размер указан? выложи свой виджет если можешь.


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: Гурман от Июль 03, 2011, 17:52
размер не статический, но я пытаюсь скомпоновать иначе

как было в втором табе скомпоновано?


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: kambala от Июль 03, 2011, 17:54
horizontalLayout - это ж можно прямо в файле посмотреть :)


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: Гурман от Июль 03, 2011, 18:00
да в файле то посмотреть - как в дизайнере это было сделано? какими действиями?

и как скомпонованы левый список и табы, чтобы они менялись за окном? я для этого использую Vertical Layout или Horizontal Layout из палитры, тогда появляется horizontalLayoutWidget, который я в конструкторе окна делаю centralWidget - тогда кинутые уже в него виджеты синхронно меняются


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: Гурман от Июль 03, 2011, 18:11
о, получилось...

если просто "компоновать" левый список и табы, то дополнительный horizontalLayoutWidget не образуется, а просто horizontalLayout не виджет, и его нельзя сделать centralWidget, чтобы его размер следил автоматом за окном

поэтому приходится кидать на окно сначала horizontalLayout из палитры виджетов, и в него уже список и рядом табы

и только потом в таб можно кинуть текст и скомпоновать его с табом - так работает

а если попытаться в таб кинуть horizontalLayout и его скомпоновать с табом - не работает

намудрили Тролли с этими компоновками...


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: kambala от Июль 03, 2011, 18:16
"в файле" это в смысле прямо в дизайнере в окошке "инспектор объектов".

как сделал - бросил на главный виджет лист- и табвиджеты, нажал на главном виджете правой кнопкой "компоновка - по горизонтали"; далее бросил на каждый таб по текстэдиту, на второй таб нажал правой кнопкой - "компоновка - по горизонтали".

к посту выше: да, именно так. а вообще лучше компоновать прямо в коде - потом быстрее перемещать/добавлять виджеты.


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: Гурман от Июль 03, 2011, 18:23
кстати, оно то работает, но как-то немного странно - у меня скин в винде установлен нестандартный, так видно, что рисунок нижней границы таба не перемещается при изменениях размеров окна - сама граница меняется, но ее изображение все время на одном месте, под текстом


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: Гурман от Июль 04, 2011, 09:47
блин... а вот получить текст, связанный с табом, не выходит

добавляю таб с текстом таким образом:

Код:
void EditWindow::addTextTab( QString name )
{
    QWidget* tab = new QWidget();
    QHBoxLayout *hlayout = new QHBoxLayout( tab );
    QTextEdit* tE = new QTextEdit( tab );
    hlayout->addWidget( tE );
    ui->tabWidget->addTab( tab, name );
}

пока все замечательно, текст есть, ресайзится, как надо

но когда пытаюсь получить к нему доступ

Код:
QTextEdit* tE = qobject_cast<QTextEdit*>(ui->tabWidget->currentWidget());

банан, указатель нулевой, очевидно из-за наличия QHBoxLayout

и никак не понятно, как этот указатель получить, поскольку QHBoxLayout - не QWidget


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: Гурман от Июль 04, 2011, 10:22
и так тоже

Код:
QTextEdit* tE = static_cast<QTextEdit*>(ui->tabWidget->currentWidget());

не работает, указатель не нулевой, но и не верный


Название: Re: Что-то я в QTabWidget запутался...
Отправлено: Гурман от Июль 04, 2011, 10:47
фух... допер наконец-то

Код:
QTextEdit* tE = ui->tabWidget->currentWidget()->findChild<QTextEdit*>();

причем практически везде неправильно советуют через qobject_cast или static_cast