0 / 0 / 0
Регистрация: 01.08.2023
Сообщений: 13
|
||||||
1 | ||||||
Закрытие QTabWidget21.09.2023, 10:03. Показов 1052. Ответов 18
Метки нет Все метки)
(
Добрый день. При закрытии виджета QTabWidget (через крестик), у него вызывается событие, которое удаляет мой класс из виджета. Я хотел бы избежать этого. Попробовал переопределить clossEvent, но даже туда не попадал.
создание виджета
0
|
|
21.09.2023, 10:03 | |
Ответы с готовыми решениями:
18
QTabWidget QT QTabWidget QtabWidget C++ QTabWidget :) QTabWidget |
1458 / 692 / 307
Регистрация: 02.05.2020
Сообщений: 1,569
|
|
21.09.2023, 21:06 | 2 |
Какой нибудь минимальный запускабельный пример, воспроизводящий проблему, можете предоставить? Сложно понять, что вы хотите сделать.
0
|
0 / 0 / 0
Регистрация: 01.08.2023
Сообщений: 13
|
|
22.09.2023, 06:44 [ТС] | 3 |
С запускаемым примером проблемно будет, могу объяснить чуть лучше. У меня есть QTreeView и QMdiArea. Когда я нажимаю на элемент в QTreeView, в QMdiArea создается QTabWidget, внутри которого находится мой собственный класс. Этот QTabWidget также сохраняется в widgetMap. Однако, если я нажимаю на крестик в правом верхнем углу QTabWidget, это вызывает событие, которое в свою очередь вызывает деструктор моего класса, который находится внутри QTabWidget. Я хочу переопределить это событие, чтобы мой класс не уничтожался(тк он не создается в этом месте больше и при попытке снова нажать на уже закрытый элемент в QTreeView программа падает).
0
|
400 / 300 / 60
Регистрация: 29.05.2018
Сообщений: 946
|
|
22.09.2023, 07:55 | 4 |
Целый виджет? М.б., всё-таки таб?
Опять же, внутри таба или табвиджета? Слишком много непонятностей пока. Хоть скрин приложения можете показать?
0
|
0 / 0 / 0
Регистрация: 01.08.2023
Сообщений: 13
|
|
22.09.2023, 08:09 [ТС] | 5 |
Создается целый виджет
нажимаю крестик относящийся именно к QTabWidget(не к табу)
Привожу пример виджета(в данном случае табов нет)
0
|
947 / 568 / 166
Регистрация: 30.03.2021
Сообщений: 1,902
|
|
22.09.2023, 14:36 | 6 |
Какой класс? tabWidget? (не класс вообще-то, а обьект класса)
По идее, удалять не должно, если у окна (виджета или QMdiSubWindow) не включен атрибут Qt_WA_DeleteOnClose. Как вы поняли, что обьект удален? Скорее всего, вы сами удаляете его (или удаляете из списка, в котором смотрите) в своем коде. Для проверки можете создать свой кастомный класс от QWidget или QTabWidget, и в конструкторе выводить в консоль дебага сообщение о создании, а в деструкторе - о уничтожении-что бы проверить, где это все происходит у вас. Идея прикольная, вроде что-то похожее сделал:
0
|
0 / 0 / 0
Регистрация: 01.08.2023
Сообщений: 13
|
||||||
22.09.2023, 15:03 [ТС] | 7 | |||||
Тут очень просто, поставил точку на деструктор и после закрытия виджета попал туда.
Вот класс AbstractBord, который наследуется от QWidget. QMap <quint8, AbstractBord*> mapBrd = pManProj->getMapBrd(); Добавлено через 10 минут Там главная фишка в том, чтобы при нажатии на элемент в дереве виджет поднимался Кликните здесь для просмотра всего текста
0
|
947 / 568 / 166
Регистрация: 30.03.2021
Сообщений: 1,902
|
||||||
22.09.2023, 15:27 | 8 | |||||
diray11, если просто закрываете окно, обьект этого окна по дефолту продолжает существовать, если для него не был установлен атрибут Qt::WA_DeleteOnClose. Что происходит в вашем коде- знаете только вы, а мне разбираться будет лень, даже если покажете его весь. Гадать можно бесконечно: может вы грохате весь виджет MDIArea, может где-то в коде происходит удаление, и тд и тп. По кускам кода понять сложно, а весь его проверять - напряжно (мне, ну мб кто-нить захочит промониторить, я хз).
Могу только посоветовать удалять виджет при закрытии окна, а для временного скрытия есть минимизация окна - вы можете видеть на гифке, я добавил три кнопки в ячейку QTreeView: минимайз, максимайз, закрытие. Вот скрытие/ показ окна -кнопками максимайза/минимайза, а при закрытии окна -оно и весь его контент удаляется, что по логике вроде. Добавлено через 3 минуты Как я уже написал, можете добавить отдельные кнопки в ячейку дерева, а так же обработать выделение строки в дереве и выделение субокна мышкой, что бы засинхронить их выделение/фокус. Я так сделал. Добавлено через 12 минут Зы можно немного упростить работу с сабокнами, если связать их с ячейками дерева:
0
|
1458 / 692 / 307
Регистрация: 02.05.2020
Сообщений: 1,569
|
|
22.09.2023, 20:49 | 9 |
ОК, а где это класс (хотя будет правильнее экземпляр класса) был до создания QTabWidget? Объект гдето существовал, вы его перенесли на вкладку, и по закрытии вкладки хотите его вернуть кудато, а вернуть нельзя, так как он грохнут, верно?
0
|
947 / 568 / 166
Регистрация: 30.03.2021
Сообщений: 1,902
|
|
22.09.2023, 23:48 | 10 |
Похоже, что в этом случае нет...
Убрал Qt::WA_DeleteOnClose и попробовал Что странно, у виджета, который добавлен в QMdiSubWindow, срабатывает таки деструктор при закрытии QMdiSubWindow, даже если атрибут WA_DeleteOnClose не был для него установлен. Почему так-я хз... Кликните здесь для просмотра всего текста
В доке написано:
-Once the subwindow has been added, its parent will be the viewport widget of the QMdiArea. То есть по идее оно должно быть, пока есть QMdiArea. -The widget can be either a QMdiSubWindow or another QWidget (in which case the MDI area will create a subwindow and set the widget as the internal widget). Виджет становится внутренним виджетом сабокна и получает его флаги, и по идее должен быть, пока есть сабокно. Про то, что внутренний виджет полюбому чпокается, если сабокно закрывается, я инфы вроде не увидел... Так то оно мне лично никак не мешает, я всегда устанавливаю WA_DeleteOnClose для окна в таких случаях, но ради интереса -это реализация такая специфическая или баг?
0
|
0 / 0 / 0
Регистрация: 01.08.2023
Сообщений: 13
|
||||||
23.09.2023, 12:48 [ТС] | 11 | |||||
Ну почти все так, для каждой владыки есть свой класс, при закрытии QTabWidget(не вкладки), QMdiSubWindow посылает сигнал который вычищает все мои классы. Мб из за того что классы унаследованы от qwidget и он честно очищает все виджеты. А эти классы больше не создаются и поэтому программа падает на этом месте
Кликните здесь для просмотра всего текста
Добавлено через 18 минут Не совсем понял вопрос
0
|
947 / 568 / 166
Регистрация: 30.03.2021
Сообщений: 1,902
|
|
23.09.2023, 13:28 | 12 |
Это не к вашему коду вопрос, а скорее риторический, он врятли кому-то интересен на этом форуме
![]() Вы были правы, -как уже выше написал,- внутренний виджет окна QMdiSubWindow уничтожается при закрытии этого самого окна... Почему так сделано разработчиками-мне не понятно: Кликните здесь для просмотра всего текста
в документации рекомендуют программисту самому устанавливать атрибут WA:: DeleteOnClose на окно QMdiSubWindow при его создании, при том что внутренний виджет уничтожается при закрытии окна в любом случае... По логике тогда можно было сделать установку WA:: DeleteOnClose внутри реализации QMdiSubWindow, либо, если предусмотрено продление его существования, то же должно быть и с внутренним виджетом.
Вполне возможно, что я чего-то недопонял или доку недочитал. Честно говоря, ответ на этот вопрос меня не особо то и волнует, так как не вижу смысла продлевать существование обьекта окна в данном случае. По сабжу, видимо вы, как сказал уважаемый kapbepucm, обращаетесь к обьектам, когда они уже не существуют. Я бы посоветовал заворачивать такие обьекты в смартпоинтеры и проверять их валидность перед обращением. И пересмотреть логику кода.
0
|
0 / 0 / 0
Регистрация: 01.08.2023
Сообщений: 13
|
|
23.09.2023, 13:40 [ТС] | 13 |
Ну, из за этой фишки логику точно пересмотреть надо, а по факту элемента в дереве не будет если не будет объекта, так что я считаю что это проверка излишняя(Так как эти объекты не должны удаляться)
0
|
947 / 568 / 166
Регистрация: 30.03.2021
Сообщений: 1,902
|
||||||
23.09.2023, 15:12 | 14 | |||||
В качестве бреда, получилось (вроде, но не уверен на 100%) предотвратить удаление виджета, который засовывается в QMdiSubWindow (окно прячется при нажатии на [x], через 3 сек появляется снова, не смотря даже на то, что атрибут deleteOnClose установлен, - короче, у меня уже когнитивный диссонанс от всей этой фигни
![]() Эта хрень, скорее всего, чревата UB,- показываю ради прикола, - не делайте так, разве что для развлечения.
0
|
1458 / 692 / 307
Регистрация: 02.05.2020
Сообщений: 1,569
|
||||||
23.09.2023, 20:15 | 15 | |||||
![]() Решение
Вы
![]()
2
|
947 / 568 / 166
Регистрация: 30.03.2021
Сообщений: 1,902
|
|||||||||||
23.09.2023, 21:20 | 16 | ||||||||||
Нет, на QMdiSubWindow я его и устанавливал.
Но, если я не хотел его использовать, просто комментировал
Сделал принудительно установку в false, как у вас - и да, это работает... Тогда получается, я где-то не понял доку... В любом случае, спасибо за ваш ответ, я считаю его решением проблемы. Добавлено через 11 минут Вот цитата из доки на всякий, как я понял, флаги внутреннего виджета перекрываются флагами QMdiSubWindow. И надо включить WA_DeleteOnClose если бла бла бла. Я думал, этот флаг по умолчанию false. ![]() Добавлено через 18 минут зы: И кстати, интересный факт, я попробовал установить атрибут в true, а в качестве виджета такой класс
но по нажатии кнопки все равно выводится. Почему так? ![]()
0
|
1458 / 692 / 307
Регистрация: 02.05.2020
Сообщений: 1,569
|
|
23.09.2023, 21:54 | 17 |
0
|
947 / 568 / 166
Регистрация: 30.03.2021
Сообщений: 1,902
|
|
23.09.2023, 22:26 | 18 |
kapbepucm, я извиняюсь, -сейчас попробовал запустить, но сделал очистку проекта, -и поведение изменилось на ожидаемое-обьект удаляется при закрытии окна и по нажатию на кнопку уже не выводится. Видимо глюк был. Еще раз сорри
![]()
0
|
0 / 0 / 0
Регистрация: 01.08.2023
Сообщений: 13
|
|
25.09.2023, 07:21 [ТС] | 19 |
Всем спасибо, ошибка была в этом
и вполне логично почему он его вычищал даже без использования атрибута
0
|
25.09.2023, 07:21 | |
25.09.2023, 07:21 | |
Помогаю со студенческими работами здесь
19
Работа с QTabWidget QOpenGLWidget+QTabWidget QTabWidget Tabs size Подчёркнутый текст в QTabWidget Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |