Удалить QLayoutItem из макета, но все еще использовать его позже? - PullRequest
1 голос
/ 26 сентября 2011

Сначала среда

Теперь у меня есть несколько классов "Holder" и один вертикальный QVBoxLayout (называемый Sidebar).В этом макете я хочу, чтобы отображались оба редактора свойств текущего выбранного класса держателей.

И есть проблема: когда пользователь выбирает другой класс держателей, мне нужны редакторы свойств ранее выбранного держателяисчезнуть и добавьте редакторы свойств нового выбранного класса Holder.

Выбор другого класса Holder выполняется один раз.Но когда я снова выбираю первый класс Holder, редакторы, похоже, не меняются.Зачем?"TakeAt (..)" уничтожает ссылку в классе держателя?Как я могу получить желаемое поведение?

Вот код, заранее спасибо:

void App::setSelection(Holder * holder){
    if(m_currentlySelected == holder) return;

    m_viewer->sideBarRemoveAt(0);
    m_viewer->sideBarInsertAt(0, holder->firstPropEditor);
    m_viewer->sideBarRemoveAt(1);
    m_viewer->sideBarInsertAt(1, holder->secondPropEditor);

    m_currentlySelected = holder;
}

void QtViewer::sideBarRemoveAt(int i){
    m_sideBar->m_layout->takeAt(i);
}

void QtViewer::sideBarInsertAt(int i, QWidget * widget){
    m_sideBar->m_layout->insertWidget(i, widget);
}

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

QLayout::takeAt() не удаляет виджет QLayoutItem из родительского виджета.Единственная причина, по которой это может сработать в первый раз, вероятно, в том, что другие виджеты были выше (по z-index) первыми.

Вместо того, чтобы играть с макетом, вы можете

  • просто скрыть / показать свои 2 PropertyEditor всякий раз, когда держатель меняется, скрытые элементы не создают дыр в макете, следующий видимый элемент отображается так, как если бы скрытые элементы не были частью макета, или
  • используйте QStackedWidget, чтобы сложить все PropertyEditor в одном месте и выбрать, какой из них отображается (с QStackedWidget::setCurrentIndex()).
0 голосов
/ 26 сентября 2011

Уничтожает ли "takeAt (..)" ссылку в классе держателя?

Нет, этот метод удаляет QLayoutItem из макета. См. справочную страницу для takeAt . Этот класс не выпускает элемент макета (это ваша обязанность).

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

Мне не совсем понятно, чего вы пытаетесь достичь (недостаточно кода в вашем примере), но если вы пытаетесь изменить макет с помощью QLayoutItem, тогда проще всего создать новый макет и добавить элементы, которые вы хотите дисплей к нему. Или просто удалите все элементы из макета и добавьте элементы, которые должны быть видны.

...