Название: (РЕШЕНО)Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: Гурман от Март 11, 2015, 22:45 В классе, наследующем QGraphicsScene, переопределен виртуальный метод dropEvent(QGraphicsSceneDragDropEvent *event). Всё работает, но захотелось вывести сообщение при попытке уронить драг в некую недопустимую позицию сцены. И неожиданно, вместо вывода сообщения с помощью QMessage::warning() - падение, причем в отладчике нет возврата в мой код. Падает в потрохах Qt при рисовании чего-то (виден вызов paint() за несколько вызовов до места падения). А само падение происходит где-то в Ассемблерном коде. Лазить, анализировать что там не так - нет необходимости, косячит не мой код. Взведу флаг и выведу сообщение в другом месте.
Но любопытно - не помню ничего в документации об этом. Я что-то пропустил или баг? Название: Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: kambala от Март 12, 2015, 00:11 вероятно, dropEvent вызывается не в главном потоке
Название: Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: Гурман от Март 12, 2015, 00:55 В документации на Qt нет ничего о том, в каком потоке вызывается dropEvent(). Хотя это очевидно функция GUI, который вроде бы весь в главном потоке должен работать.
Название: Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: Bepec от Март 12, 2015, 08:13 Где то вы попортили память, скорее всего. А Message просто на неё натыкается.
Название: Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: Old от Март 12, 2015, 08:24 Предположу, что это происходит из-за того, что вы пытаетесь внутри обработчика события запустить дальнейшую обработку событий (запустить цикл eventloop).
Название: Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: Fregloin от Март 12, 2015, 11:20 лучше в этом месте испускайте сигнал и обрабатывайте его в слоте, даже если это в одном потоке.
я тоже сталкивался с подобными падениями, когда хотел в QAbstractItemModel наследнике вывести QMessageBox. Решилось испусканием сигнала. Название: Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: Гурман от Март 12, 2015, 12:33 Предположу, что это происходит из-за того, что вы пытаетесь внутри обработчика события запустить дальнейшую обработку событий (запустить цикл eventloop). Я же написал - просто попытался QMessage выдать. Я бы ожидал, что вызов dropEvent происходит вне нити, в которой крутится цикл обработки событий. Ну мало ли что тут надо делать... лучше в этом месте испускайте сигнал и обрабатывайте его в слоте, даже если это в одном потоке. Именно так и сделал уже. Только надо влоб делать QueuedConnection, иначе Auto делает Direct и всё равно падает. И удобнее invokeMethod(), а не сигнал, с некоторых пор я этим способом даже более активно пользуюсь. Что характерно, внутри Qt он тоже применяется активнее коннектов. Название: Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: Old от Март 12, 2015, 17:33 Я же написал - просто попытался QMessage выдать. А что по вашему делает эта функция: создает диалог и запускает exec, в котором и запускается цикл обработки событий.Поэтому и сигнал со слотом нужно соединять (или инвокать) как QueuedConnection, что бы дать возможность выйти из обработчика события. Название: Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: Гурман от Март 12, 2015, 18:42 Я же написал - просто попытался QMessage выдать. А что по вашему делает эта функция: создает диалог и запускает exec, в котором и запускается цикл обработки событий.Поэтому и сигнал со слотом нужно соединять (или инвокать) как QueuedConnection, что бы дать возможность выйти из обработчика события. Если бы в документации было четко написано - dropEvent() вызывается напрямую в нити цикла обработчика сообщений, вопросов бы не было Название: Re: Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning() Отправлено: Old от Март 12, 2015, 19:06 Если бы в документации было четко написано - dropEvent() вызывается напрямую в нити цикла обработчика сообщений, вопросов бы не было dropEvent вызывается в главной (UI) ните, там где работает цикл обработки событий всей графики. |