Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: daimon от Мая 25, 2012, 15:42



Название: bug layout in Subwindow
Отправлено: daimon от Мая 25, 2012, 15:42
наткнулся на проблему с лейаутом - не хочет изменять размер subWindow как-только меняется содержимое этого окна (добавляю новый таб с виджетами), стоит только коснутся до изменения размера subWindow (мышей) и тут лейаут отрабатывает и ставит минимальный размер subWindow по контенту

Код
C++ (Qt)
#include "buglayoutsubwindow.h"
bugLayoutSubWindow::bugLayoutSubWindow(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
 
/*create widget of subWindow*/
m_widget = new QWidget(0);
/*create any layout (vertical) in temp widget (of subWindow)*/
QVBoxLayout * layout=new QVBoxLayout(m_widget);
 
/*add widgets to layout*/
m_tabWidget =new QTabWidget(m_widget);
layout->addWidget(m_tabWidget);
m_pushButton = new QPushButton("add tab", m_widget);
layout->addWidget(m_pushButton);
 
m_widget->setLayout(layout);
/*set widget into subWindow*/
ui.mdiArea->addSubWindow(m_widget);
/*signal-slot for create new tab in subWindow*/
connect(m_pushButton,SIGNAL(clicked()),this,SLOT(addTab()));
}
void bugLayoutSubWindow::addTab()
{
/*create widget into 'new' tab*/
QWidget *widget = new QWidget(m_tabWidget);
 
/*create any layout (vertical) into 'new' tab's widget*/
QVBoxLayout * layout=new QVBoxLayout(widget);
 
/*add widgets to layout*/
QPushButton *pushButton = new QPushButton("verify layout", widget);
layout->addWidget(pushButton);
 
widget->setLayout(layout);
 
/*add new tab - set widget with layout*/
m_tabWidget->addTab(widget,"new tab");
 
/* bug - layout don`t resize subwindow when tab was added. but when I resize subWindow, layout resized subWindow automatically (layout 'setMinimumSize' for subWindow)*/
}

простенький пример в аттаче


может стоит написать на багтрекер тролям?


Название: Re: bug layout in Subwindow
Отправлено: navrocky от Мая 25, 2012, 15:47
Напиши. Недавно обсуждалось это, в итоге был применен костыль. Я раньше тоже натыкался, не помню как выкрутился.


Название: Re: bug layout in Subwindow
Отправлено: Bepec от Мая 25, 2012, 15:51
Насколько я помню, так было всегда. Лейаут отрабатывает при изменении размеров его самого.

Выкручивался я лично обычным qApp->processEvents();. Ну и в некоторых случаях просто соединял сигналы ресайзеда.(или не соединял Оо)

PS если честно, не помню каким образом он помогает, но работает блин ;)


Название: Re: bug layout in Subwindow
Отправлено: V1KT0P от Мая 25, 2012, 15:54
Что-то не понял что именно надо сделать чтоб лейаут установил минимальный размер? Изменял размер обоих окон и добавлял новый таб в разных комбинациях и не увидел где там лейаут изменяется в минимальный размер.
Qt 4.8.0


Название: Re: bug layout in Subwindow
Отправлено: daimon от Мая 25, 2012, 16:06
Что-то не понял что именно надо сделать чтоб лейаут установил минимальный размер? Изменял размер обоих окон и добавлял новый таб в разных комбинациях и не увидел где там лейаут изменяется в минимальный размер.
Qt 4.8.0
нажми на кнопку добавить новый таб и увидишь, что лейаут не изменил размер subWindow окна под его содержимое - все виджеты стали обрезаны), а если будет обычный виджет - не subWindow и не в mdiArea всё будет работать


Название: Re: bug layout in Subwindow
Отправлено: navrocky от Мая 25, 2012, 16:12
Потестил. Linux 32, Qt-4.8.0. Глючит как описано.


Название: Re: bug layout in Subwindow
Отправлено: GreatSnake от Мая 25, 2012, 16:28
Воркэраунд:
после добавления первого таб-а вставь
Код
C++ (Qt)
if( m_tabWidget->count() == 1 )
m_widget->parentWidget()->adjustSize();
 


Название: Re: bug layout in Subwindow
Отправлено: V1KT0P от Мая 25, 2012, 16:29
нажми на кнопку добавить новый таб и увидишь, что лейаут не изменил размер subWindow окна под его содержимое - все виджеты стали обрезаны), а если будет обычный виджет - не subWindow и не в mdiArea всё будет работать
А понял, я сперва рефлексно увеличивал окно и клацал, думал что-то должно уменьшиться =).
Я вот попробовал в функцию добавления табов добавить строку:
Код
C++ (Qt)
m_widget->resize(700, 700);
Так она не отрабатывает. о_О.


Название: Re: bug layout in Subwindow
Отправлено: daimon от Мая 25, 2012, 16:29
https://bugreports.qt-project.org/browse/QTBUG-25915
блин изначально криво написал таск, а там править нельзя после сохранения, пришлось в комменте нормально код написать))


Название: Re: bug layout in Subwindow
Отправлено: daimon от Мая 25, 2012, 16:33
Воркэраунд:
после добавления первого таб-а вставь
Код
C++ (Qt)
if( m_tabWidget->count() == 1 )
m_widget->parentWidget()->adjustSize();
 
шаманство, но пока работает, думаю как сломать задумку, сейчас подключу туда, где пример сложнее раза в 3


Название: Re: bug layout in Subwindow
Отправлено: V1KT0P от Мая 25, 2012, 16:35
шаманство, но пока работает, думаю как сломать задумку, сейчас подключу туда, где пример сложнее раза в 3
А ты сделай так чтоб при последующих табах добавлялось две кнопки. И это уже не будет работать.


Название: Re: bug layout in Subwindow
Отправлено: daimon от Мая 25, 2012, 16:41
шаманство, но пока работает, думаю как сломать задумку, сейчас подключу туда, где пример сложнее раза в 3
А ты сделай так чтоб при последующих табах добавлялось две кнопки. И это уже не будет работать.
блин баг Qt


Название: Re: bug layout in Subwindow
Отправлено: GreatSnake от Мая 25, 2012, 16:43
А ты сделай так чтоб при последующих табах добавлялось две кнопки. И это уже не будет работать.
С чего это вдруг?


Название: Re: bug layout in Subwindow
Отправлено: daimon от Мая 25, 2012, 16:46
уже не работает
Код
C++ (Qt)
MdiChild * MainWindow::createMdiChild()
{
MdiChild *child = new MdiChild(ui.mdiArea);
 
QMdiSubWindow * sub = ui.mdiArea->addSubWindow(child);
 
sub->adjustSize();
 
return child;
}
////////////
MdiChild::MdiChild(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
   setAttribute(Qt::WA_DeleteOnClose);
   isUntitled = true;
 
QVBoxLayout *verticalLayout = new QVBoxLayout(this);
m_tabWidget = new TabWidget(this);
verticalLayout->addWidget(m_tabWidget);
 
setLayout(verticalLayout);
 
}
 
TabWidget - просто по форме сгенереный класс, там есть QTabWidget ну и табы (тоже мой класс: 2 списка и 2 кнопки с лейаутами), управляет расположением вертикальный лейаут. Принцип тот же - добавляю таб и он создаёт мой виджет и вешает на таб


Название: Re: bug layout in Subwindow
Отправлено: V1KT0P от Мая 25, 2012, 16:51
С чего это вдруг?
А ты сам попробуй, даже если при каждом добавлении таба делать. Ибо при добавлении таба не происходит переключение на него. Скрин в подтверждение.


Название: Re: bug layout in Subwindow
Отправлено: daimon от Мая 25, 2012, 16:59
регайтесь на багтрекере и ставте на мой баг просматривать - может поправят быстрее
https://bugreports.qt-project.org/browse/QTBUG-25915 (https://bugreports.qt-project.org/browse/QTBUG-25915)


Название: Re: bug layout in Subwindow
Отправлено: navrocky от Мая 25, 2012, 18:22
Проголосовал. Пока я один (


Название: Re: bug layout in Subwindow
Отправлено: daimon от Мая 25, 2012, 23:34
Проголосовал. Пока я один (
спс лучше, чем я один
кстати это продолжение темы http://www.prog.org.ru/index.php?topic=21860.msg152485#msg152485 (http://www.prog.org.ru/index.php?topic=21860.msg152485#msg152485)