Russian Qt Forum
Ноябрь 24, 2024, 20:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: После вызова QLayout::replaceWidget перестают работать сосседние виджеты  (Прочитано 4323 раз)
mitrich
Гость
« : Декабрь 25, 2014, 15:47 »

Создаю QGridLayout, располагаю в нем QTabBar-ы по бокам и виджет в центре. Центральный виджет надо будет иногда заменять: вызываю QLayout::replaceWidget и после этого левый и верхний QTabBar-ы перестают реагировать на клики мышью.
Код
C++ (Qt)
   QTabBar *leftTabs   = new QTabBar;
   QTabBar *rightTabs  = new QTabBar;
   QTabBar *topTabs    = new QTabBar;
   QTabBar *bottomTabs = new QTabBar;
 
   //настраиваем табвиджеты-------------------------
   leftTabs->setShape(QTabBar::RoundedEast);
   rightTabs->setShape(QTabBar::RoundedWest);
   topTabs->setShape(QTabBar::RoundedSouth);
   bottomTabs->setShape(QTabBar::RoundedNorth);
 
   leftTabs->addTab("Aaaaaaaaaa");
   leftTabs->addTab("Bbbbbbbbbb");
   rightTabs->addTab("Aaaaaaaaaa");
   rightTabs->addTab("Bbbbbbbbbb");
   topTabs->addTab("Aaaaaaaaaa");
   topTabs->addTab("Bbbbbbbbbb");
   bottomTabs->addTab("Aaaaaaaaaa");
   bottomTabs->addTab("Bbbbbbbbbb");
   //---------------------------------------------------
 
   QWidget *central = new QWidget;
   central->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
   QGridLayout *gridLayout = new QGridLayout;
   gridLayout->setSpacing(0);
   gridLayout->setContentsMargins(0, 0, 0, 0);
   gridLayout->addWidget(topTabs,    0, 0, 1, 3);
   gridLayout->addWidget(leftTabs,   1, 0, 1, 1);
   gridLayout->addWidget(central,    1, 1, 1, 1);
   gridLayout->addWidget(rightTabs,  1, 2, 1, 1);
   gridLayout->addWidget(bottomTabs, 2, 0, 1, 3);
 
   setLayout(gridLayout);
 
   //заменяем центральный виджет:
   QWidget *newcentral = new QWidget;
   newcentral->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
   gridLayout->replaceWidget(central, newcentral);
 

Пробовал вместо QGridLayout использовать QVBoxLayout + QHBoxLayout - результат точно такой же.

Qt 5.3.1, Windows(MinGW)
« Последнее редактирование: Декабрь 25, 2014, 16:08 от mitrich » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Декабрь 25, 2014, 16:27 »

Код
C++ (Qt)
central->setVisible(false);
Записан
mitrich
Гость
« Ответ #2 : Декабрь 25, 2014, 16:51 »

Спасибо, работает. Надо было мне внимательнее доки читать:
Цитировать
The returned layout item is no longer owned by the layout and should be either deleted or inserted to another layout. The widget from is no longer managed by the layout and may need to be deleted or hidden. The parent of widget from is left unchanged.

Правда, я также обнаружил, что метод replaceWidget появился только в Qt 5.2, так что скорее всего, если нужна будет поддержка Qt 4, всё равно придется каждый раз новый Layout создавать.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Декабрь 25, 2014, 17:00 »

QLayout::​removeWidget
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Декабрь 25, 2014, 17:00 »

Правда, я также обнаружил, что метод replaceWidget появился только в Qt 5.2, так что скорее всего, если нужна будет поддержка Qt 4, всё равно придется каждый раз новый Layout создавать.
Зачем, коли есть takeAt() & addItem() ?
Записан

Qt 5.11/4.8.7 (X11/Win)
mitrich
Гость
« Ответ #5 : Декабрь 25, 2014, 17:22 »

Опять всё нужное пропустил Улыбающийся
Спасибо ещё раз, теперь всё как надо.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Декабрь 25, 2014, 17:55 »

Зачем, коли есть takeAt() & addItem() ?
Не разобрался, как это работает. Не сложно будет пояснить?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Декабрь 25, 2014, 18:02 »

takeAt() возвращает отвязанный от лэйаут айтем, который потом можно вставить в другое место или вообще в другой лэйаут через addItem() или вообще его удалить.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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