#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 (макет), чтобы удалить одну конкретную вещь из макета. Но с этим нужно быть осторожным. В документе говорится:
Удаляет виджет из макета. После этого вызова вызывающая сторона несет ответственность за придание виджету приемлемой геометрии или за то, чтобы поместить виджет обратно в макет.
Итак, вы хотите убедиться, что вы также удалите виджет впоследствии, чтобы убедиться, что он нигде не отображается.
Однако другая проблема с этим подходом заключается в том, что если виджет / макет, который вы вставляете / удаляете, находится где-то посередине множества других виджетов в вашем макете, тогда вам будет очень весело пытаться заменить его в правильном месте.
Вот почему я обычно пытаюсь создать макет специально для этой цели, в котором больше ничего нет.