Russian Qt Forum
Мая 25, 2025, 07:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: bug layout in Subwindow  (Прочитано 9190 раз)
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)*/
}

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


может стоит написать на багтрекер тролям?
« Последнее редактирование: Мая 25, 2012, 15:48 от daimon » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Мая 25, 2012, 15:47 »

Напиши. Недавно обсуждалось это, в итоге был применен костыль. Я раньше тоже натыкался, не помню как выкрутился.
Записан

Гугль в помощь
Bepec
Гость
« Ответ #2 : Мая 25, 2012, 15:51 »

Насколько я помню, так было всегда. Лейаут отрабатывает при изменении размеров его самого.

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

PS если честно, не помню каким образом он помогает, но работает блин Подмигивающий
Записан
V1KT0P
Гость
« Ответ #3 : Мая 25, 2012, 15:54 »

Что-то не понял что именно надо сделать чтоб лейаут установил минимальный размер? Изменял размер обоих окон и добавлял новый таб в разных комбинациях и не увидел где там лейаут изменяется в минимальный размер.
Qt 4.8.0
Записан
daimon
Гость
« Ответ #4 : Мая 25, 2012, 16:06 »

Что-то не понял что именно надо сделать чтоб лейаут установил минимальный размер? Изменял размер обоих окон и добавлял новый таб в разных комбинациях и не увидел где там лейаут изменяется в минимальный размер.
Qt 4.8.0
нажми на кнопку добавить новый таб и увидишь, что лейаут не изменил размер subWindow окна под его содержимое - все виджеты стали обрезаны), а если будет обычный виджет - не subWindow и не в mdiArea всё будет работать
« Последнее редактирование: Мая 25, 2012, 16:08 от daimon » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #5 : Мая 25, 2012, 16:12 »

Потестил. Linux 32, Qt-4.8.0. Глючит как описано.
Записан

Гугль в помощь
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Мая 25, 2012, 16:28 »

Воркэраунд:
после добавления первого таб-а вставь
Код
C++ (Qt)
if( m_tabWidget->count() == 1 )
m_widget->parentWidget()->adjustSize();
 
Записан

Qt 5.11/4.8.7 (X11/Win)
V1KT0P
Гость
« Ответ #7 : Мая 25, 2012, 16:29 »

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

https://bugreports.qt-project.org/browse/QTBUG-25915
блин изначально криво написал таск, а там править нельзя после сохранения, пришлось в комменте нормально код написать))
Записан
daimon
Гость
« Ответ #9 : Мая 25, 2012, 16:33 »

Воркэраунд:
после добавления первого таб-а вставь
Код
C++ (Qt)
if( m_tabWidget->count() == 1 )
m_widget->parentWidget()->adjustSize();
 
шаманство, но пока работает, думаю как сломать задумку, сейчас подключу туда, где пример сложнее раза в 3
Записан
V1KT0P
Гость
« Ответ #10 : Мая 25, 2012, 16:35 »

шаманство, но пока работает, думаю как сломать задумку, сейчас подключу туда, где пример сложнее раза в 3
А ты сделай так чтоб при последующих табах добавлялось две кнопки. И это уже не будет работать.
Записан
daimon
Гость
« Ответ #11 : Мая 25, 2012, 16:41 »

шаманство, но пока работает, думаю как сломать задумку, сейчас подключу туда, где пример сложнее раза в 3
А ты сделай так чтоб при последующих табах добавлялось две кнопки. И это уже не будет работать.
блин баг Qt
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Мая 25, 2012, 16:43 »

А ты сделай так чтоб при последующих табах добавлялось две кнопки. И это уже не будет работать.
С чего это вдруг?
Записан

Qt 5.11/4.8.7 (X11/Win)
daimon
Гость
« Ответ #13 : Мая 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 кнопки с лейаутами), управляет расположением вертикальный лейаут. Принцип тот же - добавляю таб и он создаёт мой виджет и вешает на таб
« Последнее редактирование: Мая 25, 2012, 16:57 от daimon » Записан
V1KT0P
Гость
« Ответ #14 : Мая 25, 2012, 16:51 »

С чего это вдруг?
А ты сам попробуй, даже если при каждом добавлении таба делать. Ибо при добавлении таба не происходит переключение на него. Скрин в подтверждение.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 3.154 секунд. Запросов: 23.