Russian Qt Forum
Ноябрь 01, 2024, 08:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: (РЕШЕНО)Краш в методе QGraphicsScene::dropEvent() при выводе QMessage::warning()  (Прочитано 5187 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Март 11, 2015, 22:45 »

В классе, наследующем QGraphicsScene, переопределен виртуальный метод dropEvent(QGraphicsSceneDragDropEvent *event). Всё работает, но захотелось вывести сообщение при попытке уронить драг в некую недопустимую позицию сцены. И неожиданно, вместо вывода сообщения с помощью QMessage::warning() - падение, причем в отладчике нет возврата в мой код. Падает в потрохах Qt при рисовании чего-то (виден вызов paint() за несколько вызовов до места падения). А само падение происходит где-то в Ассемблерном коде. Лазить, анализировать что там не так - нет необходимости, косячит не мой код. Взведу флаг и выведу сообщение в другом месте.

Но любопытно - не помню ничего в документации об этом. Я что-то пропустил или баг?
« Последнее редактирование: Март 12, 2015, 12:59 от Гурман » Записан

2^7-1 == 127, задумайтесь...
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #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 Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Март 12, 2015, 00:55 »

В документации на Qt нет ничего о том, в каком потоке вызывается dropEvent(). Хотя это очевидно функция GUI, который вроде бы весь в главном потоке должен работать.
Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #3 : Март 12, 2015, 08:13 »

Где то вы попортили память, скорее всего. А Message просто на неё натыкается.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Март 12, 2015, 08:24 »

Предположу, что это происходит из-за того, что вы пытаетесь внутри обработчика события запустить дальнейшую обработку событий (запустить цикл eventloop).
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Март 12, 2015, 11:20 »

лучше в этом месте испускайте сигнал и обрабатывайте его в слоте, даже если это в одном потоке.
я тоже сталкивался с подобными падениями, когда хотел в QAbstractItemModel наследнике вывести QMessageBox. Решилось испусканием сигнала.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Март 12, 2015, 12:33 »

Предположу, что это происходит из-за того, что вы пытаетесь внутри обработчика события запустить дальнейшую обработку событий (запустить цикл eventloop).

Я же написал - просто попытался QMessage выдать. Я бы ожидал, что вызов dropEvent происходит вне нити, в которой крутится цикл обработки событий. Ну мало ли что тут надо делать...

лучше в этом месте испускайте сигнал и обрабатывайте его в слоте, даже если это в одном потоке.

Именно так и сделал уже. Только надо влоб делать QueuedConnection, иначе Auto делает Direct и всё равно падает. И удобнее invokeMethod(), а не сигнал, с некоторых пор я этим способом даже более активно пользуюсь. Что характерно, внутри Qt он тоже применяется активнее коннектов.
« Последнее редактирование: Март 12, 2015, 12:59 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Март 12, 2015, 17:33 »

Я же написал - просто попытался QMessage выдать.
А что по вашему делает эта функция: создает диалог и запускает exec, в котором и запускается цикл обработки событий.
Поэтому и сигнал со слотом нужно соединять (или инвокать) как QueuedConnection, что бы дать возможность выйти из обработчика события.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Март 12, 2015, 18:42 »

Я же написал - просто попытался QMessage выдать.
А что по вашему делает эта функция: создает диалог и запускает exec, в котором и запускается цикл обработки событий.
Поэтому и сигнал со слотом нужно соединять (или инвокать) как QueuedConnection, что бы дать возможность выйти из обработчика события.


Если бы в документации было четко написано - dropEvent() вызывается напрямую в нити цикла обработчика сообщений, вопросов бы не было
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Март 12, 2015, 19:06 »

Если бы в документации было четко написано - dropEvent() вызывается напрямую в нити цикла обработчика сообщений, вопросов бы не было
dropEvent вызывается в главной (UI) ните, там где работает цикл обработки событий всей графики.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.