Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Март 11, 2015, 22:45



Название: (РЕШЕНО)Краш в методе 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) ните, там где работает цикл обработки событий всей графики.