Russian Qt Forum
Ноябрь 24, 2024, 05:36
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
(РЕШЕНО)Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: (РЕШЕНО)Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() (Прочитано 5207 раз)
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
(РЕШЕНО)Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
:
Март 11, 2015, 22:45 »
В классе, наследующем QGraphicsScene, переопределен виртуальный метод dropEvent(QGraphicsSceneDragDropEvent *event). Всё работает, но захотелось вывести сообщение при попытке уронить драг в некую недопустимую позицию сцены. И неожиданно, вместо вывода сообщения с помощью QMessage::warning() - падение, причем в отладчике нет возврата в мой код. Падает в потрохах Qt при рисовании чего-то (виден вызов paint() за несколько вызовов до места падения). А само падение происходит где-то в Ассемблерном коде. Лазить, анализировать что там не так - нет необходимости, косячит не мой код. Взведу флаг и выведу сообщение в другом месте.
Но любопытно - не помню ничего в документации об этом. Я что-то пропустил или баг?
«
Последнее редактирование: Март 12, 2015, 12:59 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
Ответ #1 :
Март 12, 2015, 00:11 »
вероятно, dropEvent вызывается не в главном потоке
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
Ответ #2 :
Март 12, 2015, 00:55 »
В документации на Qt нет ничего о том, в каком потоке вызывается dropEvent(). Хотя это очевидно функция GUI, который вроде бы весь в главном потоке должен работать.
Записан
2^7-1 == 127, задумайтесь...
Bepec
Гость
Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
Ответ #3 :
Март 12, 2015, 08:13 »
Где то вы попортили память, скорее всего. А Message просто на неё натыкается.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
Ответ #4 :
Март 12, 2015, 08:24 »
Предположу, что это происходит из-за того, что вы пытаетесь внутри обработчика события запустить дальнейшую обработку событий (запустить цикл eventloop).
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
Ответ #5 :
Март 12, 2015, 11:20 »
лучше в этом месте испускайте сигнал и обрабатывайте его в слоте, даже если это в одном потоке.
я тоже сталкивался с подобными падениями, когда хотел в QAbstractItemModel наследнике вывести QMessageBox. Решилось испусканием сигнала.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
Ответ #6 :
Март 12, 2015, 12:33 »
Цитата: Old от Март 12, 2015, 08:24
Предположу, что это происходит из-за того, что вы пытаетесь внутри обработчика события запустить дальнейшую обработку событий (запустить цикл eventloop).
Я же написал - просто попытался QMessage выдать. Я бы ожидал, что вызов dropEvent происходит
вне
нити, в которой крутится цикл обработки событий. Ну мало ли что тут надо делать...
Цитата: Fregloin от Март 12, 2015, 11:20
лучше в этом месте испускайте сигнал и обрабатывайте его в слоте, даже если это в одном потоке.
Именно так и сделал уже. Только надо влоб делать QueuedConnection, иначе Auto делает Direct и всё равно падает. И удобнее invokeMethod(), а не сигнал, с некоторых пор я этим способом даже более активно пользуюсь. Что характерно, внутри Qt он тоже применяется активнее коннектов.
«
Последнее редактирование: Март 12, 2015, 12:59 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
Ответ #7 :
Март 12, 2015, 17:33 »
Цитата: Гурман от Март 12, 2015, 12:33
Я же написал - просто попытался QMessage выдать.
А что по вашему делает эта функция: создает диалог и запускает exec, в котором и запускается цикл обработки событий.
Поэтому и сигнал со слотом нужно соединять (или инвокать) как QueuedConnection, что бы дать возможность выйти из обработчика события.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
Ответ #8 :
Март 12, 2015, 18:42 »
Цитата: Old от Март 12, 2015, 17:33
Цитата: Гурман от Март 12, 2015, 12:33
Я же написал - просто попытался QMessage выдать.
А что по вашему делает эта функция: создает диалог и запускает exec, в котором и запускается цикл обработки событий.
Поэтому и сигнал со слотом нужно соединять (или инвокать) как QueuedConnection, что бы дать возможность выйти из обработчика события.
Если бы в документации было четко написано - dropEvent() вызывается напрямую в нити цикла обработчика сообщений, вопросов бы не было
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()
«
Ответ #9 :
Март 12, 2015, 19:06 »
Цитата: Гурман от Март 12, 2015, 18:42
Если бы в документации было четко написано - dropEvent() вызывается напрямую в нити цикла обработчика сообщений, вопросов бы не было
dropEvent вызывается в главной (UI) ните, там где работает цикл обработки событий всей графики.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...