Взаимодействия Qt Layout / Widget - Макеты внутри Layouts - PullRequest
0 голосов
/ 11 мая 2011

У меня есть интерфейс в Qt 4.7, с которым я немного затрудняюсь вести себя так, как мне хочется.

Базовое описание желаемого поведения : пользователь делает выбор вполе со списком, которое заставляет запрос перейти к другой функции, которая возвращает объект QHBoxLayout, который обычно включает в себя несколько меток, редактирование строк и т. д. Это позволит настроить содержимое макета интерфейса, чтобы удалить предыдущий выбор, и добавить новыйподробности.

Что на самом деле происходит : появляется новый макет, но остается и старый, поэтому они рисуются друг над другом, что приводит к беспорядку.

Вот код, который у меня есть для слота, с которым связан сигнал currentIndexChanged:

void updateAxisLabels(const QString & value)
{
  if ( m_current != "" )
  {
    QHBoxLayout* xOld = m_transforms[m_current]->xAxis();
    m_uiForm.layoutXAxis->removeItem(m_transforms[m_current]->xAxis());
    delete m_transforms[m_current]->xAxis();
    m_transforms[m_current]->init();
  }

  m_uiForm.layoutXAxis->addLayout(m_transforms[value]->xAxis());
  m_current = value;

  m_uiForm.layoutXAxis->update();
}

Здесь m_transforms - карта, связывающая содержимое поля со списком с объектом с функцией xAxis () (возвращаяQHBoxLayout *) и функция init (), которая воссоздает макет после его удаления.m_current - это просто строка QString, которую я использую, чтобы сказать мне, какую мне нужно удалить.

Причина, по которой я ее удаляю: потому что именно это полчаса поиска в Google заставило меня поверить, что это правильная вещьделать.

Любая помощь высоко ценится.:)

1 Ответ

2 голосов
/ 11 мая 2011

Я делал подобные вещи раньше, и вам определенно нужно не только удалить виджет из макета, но и удалить его.

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

Вот рекомендуемый способ перебрать все элементы в макете и удалить их.

QLayoutItem *child;
 while ((child = m_uiForm.layoutXAxis->takeAt(0)) != 0) 
 {
     delete child;
 }

Итак, вы можете вызвать любую очистку, которую хотите сделать, прежде чем она будет удалена.

Вы также можете вызвать layout-> removeWidget (ваш виджет) или layout-> removeItem (layout), чтобы удалить одну конкретную вещь из макета. Но вы должны быть осторожны с этим. Док говорит:

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

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

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

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

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