Макет Qt / взаимодействие с виджетами — макеты внутри макетов

#c #qt

#c #qt

Вопрос:

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

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

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

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

 void updateAxisLabels(const QString amp; 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. Какой тип m_uiFormLayout.layoutXAxis ? QHBoxLayout / QXBoxLayout / QGridLayout?

2. привет @beduin: это QHBoxLayout.

3. Я думаю, может быть, вам следует удалить элементы, ранее сохраненные в функциях-членах layoutXAxis using takeAt и count . С помощью функций-членов.

Ответ №1:

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

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

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

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

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

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

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

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

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

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