Как удалить виджет?
Первый иногда удаляет то что надо, иногда не удаляет, а иногда крашит программу.
Второй какой-то неправильный что ли. работает, но прячет вместо удаления.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как создать виджет выбора файла по аналогу, как в Builder OpenDialog
Как создать виджет выбора файла по аналогу, как в Builder OpenDialog ?
Как активизировать виджет?
Нажно сделать поиск по plaintextwidget есть кнопки "назад" и "вперед" при клике на них.
Как сделать виджет неосязаемым
У меня такая ситуация: нужно один из дочерних виджетов поставить поверх других, при этом, чтобы.
Как сделать квадратный виджет?
Есть простенькая форма на которой отображается QR код: Левая часть с историей имеет.
27695 / 17314 / 3809
Регистрация: 24.12.2010
Сообщений: 38,979
Сообщение от Kuzia domovenok
Второй какой-то неправильный что ли. работает, но прячет вместо удаления.
Именно так метод hide() и был задуман. Именно так он и работает.
Первый случай непонятен без контекста. Может быть нужно w->deleteLatter()
И уж совсем непонятна причина возникновения этой строчки
Сообщение от Kuzia domovenok
QWidget* w=qobject_cast(*it);
Если вы собирались проверить, виджет ли это, тогда скорее всего так
1 2 3
QWidget* w=qobject_castQWidget*>(*it); if (!w) continue; if (it->y()==y_limit)
284 / 173 / 62
Регистрация: 13.03.2019
Сообщений: 419
Не мешало бы w проверять на не 0.
4055 / 3308 / 924
Регистрация: 25.03.2012
Сообщений: 12,447
Записей в блоге: 1
Байт, написал -не помогло.
1 2 3 4 5 6
for(QListQObject*>::const_iterator it=children().begin(); children().end()!=it; ++it) { QWidget* w=qobject_castQWidget*>(*it); if (w && w->y()==y_limit) delete w; }
Добавлено через 44 минуты
Исправил методом тыка.
Хотите узнать фокус?
18413 / 9584 / 2341
Регистрация: 30.01.2014
Сообщений: 16,742
Kuzia domovenok, может быть deleteLater() стоило использовать вместо прямого delete?
https://doc.qt.io/qt-5/qobject.html#deleteLater
4055 / 3308 / 924
Регистрация: 25.03.2012
Сообщений: 12,447
Записей в блоге: 1
DrOffset, сделал так, норм?
1 2 3 4 5 6 7 8
QListQObject*> tmp=children(); for(QListQObject*>::const_iterator it=tmp.begin(); tmp.end()!=it; ++it) { QWidget* w=qobject_castQWidget*>(*it); if (w && w->y()==y_limit) w->deleteLater(); }
18413 / 9584 / 2341
Регистрация: 30.01.2014
Сообщений: 16,742
Kuzia domovenok, ну да, я об этом и говорил. работает?
4055 / 3308 / 924
Регистрация: 25.03.2012
Сообщений: 12,447
Записей в блоге: 1
DrOffset, да, но главный трюк с работой через копию children был совершенно неочевиден, до него додуматься надо было.
18413 / 9584 / 2341
Регистрация: 30.01.2014
Сообщений: 16,742
Kuzia domovenok, копию делать не обязательно, имхо. попробуй без нее.
Добавлено через 11 минут
Kuzia domovenok, собственно падало вот почему: когда ты делаешь delete виджету, он сам в своем деструкторе удаляет себя из списка родителя. Т.е. из children. Но при этом итератор на только что удаленный виджет у тебя еще жив и после этого становится невалидным, что в конечно итоге могло привести к падению программы.
Когда ты сделал отдельную копию списка, то в ней естественно никаких изменений не происходит после удаления, поэтому это работало.
Однако, если использовать deleteLater, то никакая копия не нужна, потому что удаление элемента из списка children производит уже система Qt сама, позже.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как растянуть виджет qwt
Добрый вечер, такой вопрос. В моей программе нужно будет отображать много графиков в разных.
Как проверить, в фокусе ли виджет?
Всем доброго времени суток. Есть 3 QPlainText. Установить фокус можно с помощью setFocus(). А.
Qml виджет как SpinBox
Здравствуйте, нужна помощь, надо сделать вот такое вот:
Как в QHBoxLayout удалить все виджеты?
Доброго времени суток. Задача такая, имеется QHBoxLayout в нем несколько виджетов. Так как мне полностью удалить все виджеты в QHBoxLayout?
Как это осуществить?
Egor12
06.08.17 22:52:51 MSK
virtual int count() const
virtual QLayoutItem * itemAt(int index) const
void removeItem(QLayoutItem * item)
MimisGotAPlan
( 06.08.17 23:14:13 MSK )
а qDeleteAll на его children не сработает?
wolph ★★
( 06.08.17 23:35:42 MSK )
Какое поведение тебе нужно? ЕМНИП, при каких-то сценариях компоновщик не менял размер родительского виджета при удалении элементов компоновки.
Если нужно очистить всё, по-моему, проще удалить сам компоновщик и повесить вместо него новый. Ну либо
while(layout->count()) delete layout->takeAt(0);
XMs ★★★★★
( 07.08.17 10:08:26 MSK )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Как в QVBoxLayout удалить все layout? (2017)
- Форум Как в QStandardItem поместить QWidget? (2017)
- Форум Как поменять размер ячеек в QTableView (2017)
- Форум [Qt]Размещение виджета в центре дургого виджета (2010)
- Форум Как правильно отобразить QHBoxLayout в QScrollArea? (скрин и компилируемый пример прилагаю) (2014)
- Форум Удалить виджет с рабочего стола (2015)
- Форум Как удалить повторяющиеся виджеты плазмы? (2009)
- Форум Vim удалить все строки начинающиеся с определенного символа (2012)
- Форум Виджеты для KDE (2014)
- Форум Удалить Cashew и Виджет. (2011)
qt удаление виджетов
не могу понять почему данная конструкция не даёт результата, точнее сказать из лейаута виджет удаляется, а вот память выделенная под него нет. Причём деструктор виджета, лежащего в элемете лэйаута(item), тоже отрабатывает.
Я создал статическую переменную которая увеличивается при создании нового «Rule», и после этих строк она не уменьшается.
Прошу прощения, если вопрос глупый. Лазил в его величестве Гугле, но не нашёл внятного ответа
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Удаление виджетов
Помогите пожалуйста,срочно нужно.В главном окне есть много разных.
Qt, удаление виджетов при закрывании.
Здравствуйте, я пишу свою первую программу на qt и активно пересоздаю виджеты. Пожалуйста.
Удаление графических данных и виджетов с формы
Коротко. Писал программу и во вкладке "дизайн" расставлял слои, Widget-ы и т.д. После мне стало.
Удаление виджетов и настройка списка
Здравствуйте, создаю сайт на вордпрессе, требуется: 1)удалить полностью боковую панель.
396 / 297 / 59
Регистрация: 29.05.2018
Сообщений: 933
Сообщение было отмечено GeorgeRurikov как решение
Решение
Я делал вот так (циклическое удаление виджетов):
1 2 3 4 5 6 7 8
while(QLayoutItem* child = filterLayout->takeAt(0)) { QWidget* wgt = child->widget(); delete wgt; delete child; } filterLayout->update();
Как удалить виджет qt
Я в Qt новичок.
При удаление объектов QWidget удаляються все дочерние виджеты.
Например :
class FindDialog : public QDialog
Q_OBJECT
.
private:
QLabel* label;
QLineEdit* lineEdit;
QCheckBox* caseCheckBox;
QCheckBox* backwardCheckBox;
QPushButton* findButton;
QPushButton* closeButton;
>;
В конструкторе идет создание виджетов через new.
label = new QLabel(tr(«Findd &what»));
lineEdit = new QLineEdit;
При этом в конструкторах не передается this как parent widget.
Как FindDialog object знает, какие у него child?
Как-то сразу не могу понять. Очевидно это как-то связано с инициализацией
private data для всех widgets.
Может кто-то подсказать как это реализовано?
21.01.10 12:56: Перенесено модератором из ‘C/C++. Прикладные вопросы’ — Кодт
Re: Qt QWidget and удаление дочерних виджетов
От: | Denys V. | http://ua.linkedin.com/in/dvalchuk |
Дата: | 20.04.09 21:46 | |
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Я в Qt новичок.
А>При удаление объектов QWidget удаляються все дочерние виджеты.
А>Например :
А>class FindDialog : public QDialog
А> <
А> Q_OBJECT
А> .
А>private:
А> QLabel* label;
А> QLineEdit* lineEdit;
А> QCheckBox* caseCheckBox;
А> QCheckBox* backwardCheckBox;
А> QPushButton* findButton;
А> QPushButton* closeButton;
А>>;
А> В конструкторе идет создание виджетов через new.
А> label = new QLabel(tr(«Findd &what»));
А> lineEdit = new QLineEdit;
А>При этом в конструкторах не передается this как parent widget.
А>Как FindDialog object знает, какие у него child?
А>Как-то сразу не могу понять. Очевидно это как-то связано с инициализацией
А>private data для всех widgets.
А>Может кто-то подсказать как это реализовано?
если в последствии эти все виджеты добавляются в layout — то он их и удалит (насколько я помню)
если нет — то нужно передавать parent widget при создании как параметр конструктора.
С уважением Denys Valchuk
IMHO чем больше мнений тем оптимальней выбор варианта. 🙂
Re: Qt QWidget and удаление дочерних виджетов
От: | fdn721 |
Дата: | 21.04.09 05:46 |
Оценка: |
В QT за всеми объектами унаследованными от QObject следит их родитель.
Родитель задаётся в конструкторе или методом SetParent().
Если виджет добавляется в QLayout то QLayout ему автоматически прописывается в родители.
т.о. объекты у которых задан родитель удалятся автоматически.