Qt: один и тот же виджет внутри двух разных макетов - PullRequest
9 голосов
/ 21 сентября 2010

Я пытаюсь добиться того, чтобы виджет мог существовать в двух разных макетах, в данном случае в QHBoxLayout и QVBoxLayout. Я внедряю систему, которая динамически переключается между двумя макетами при изменении ориентации экрана устройства.

В настоящее время я создаю, скажем, сложный составной виджет под названием MyWidget и добавляю его в два разных макета:

MyWidget *wgt = new QWidget();
QVBoxLayout vlayout;
QHBoxLayout hlayout;

vlayout->addWidget(wgt);
hlayout->addWidget(wgt);

Теперь представьте, что оба макета размещены в «корневом» макете и что этот корневой макет можно изменить в более широкий, чем высокий «ландшафтный» режим, и в более высокий, чем широкий «портретный» режим.

MyWidget корректно отображается только в первом макете, в который он добавлен, а при переключении макетов все отображается неправильно или не отображается вообще.

Я не знаю, имею ли я здесь смысл, но это моя проблема. Возможно, когда вызывается событие switch, все дочерние виджеты и макеты должны быть изменены, чтобы они всегда выглядели правильно. Единственная проблема в том, что я не знаю как.

Ответы [ 2 ]

13 голосов
/ 21 сентября 2010

Это не общее решение для изменения макетов, а простое решение в вашем случае: просто измените направление boxlayout.

hlayout->setDirection(QBoxLayout::TopToBottom);
// now your hboxlayout works as vertical layout

hlayout->setDirection(QBoxLayout::LeftToRight);
// and now it is horizontal again
4 голосов
/ 21 сентября 2010

Это не особенно легко сделать, но возможно.

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

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

Другой, более сложный способ справиться с этим (хотя и потенциально более эффективным) будет написать свой собственный макет ион обрабатывает перестановку виджетов на основе изменения ориентации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...