2010-09-21 2 views
9

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

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

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

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

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

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

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

+0

Связанный вопрос: http://stackoverflow.com/questions/2990283/qt-change-qwidget-layout – rubenvb

ответ

4

Это не очень удобно, но это возможно.

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

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

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

+1

я решил написать метод, который вызывается автоматически при изменении ориентации, что (после удаления) добавляет виджеты снова в макет. – Gerstmann

12

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

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

hlayout->setDirection(QBoxLayout::LeftToRight); 
// and now it is horizontal again 
Смежные вопросы