Сбой внутреннего QMutex::блокировка при удалении подкласса QFrame в dropEvent

#qt

#qt

Вопрос:

Я пишу на C с openSUSE Linux и использую Qt Creator в качестве своей IDE.

У меня есть QFrame вызываемый подкласс Interactive , который является родительским по отношению к другому QFrame вызываемому подклассу Window . В Window::dropEvent я хочу удалить event->source , который является Interactive объектом. Итак, у меня есть настройка, подобная этой:

 void Window::dropEvent(QDropEvent *event) {

  //after identifying MIME type as an Interactive object:

  Interactive *temp = (qobject_cast<Interactive*>(event->source()));
  temp->deleteLater();

}
  

Тогда обычно все в порядке, пока я не попытаюсь сделать что-нибудь еще в своей программе, и тогда я получаю это:

 (gdb) bt
0  0xf5df218f in QMutex::lock() () from /space/cp/x86/qt/lib/libQtCore.so.4
1  0xf5f05b27 in QCoreApplication::postEvent(QObject*, QEvent*, int) () from /space/cp/x86/qt/lib/libQtCore.so.4
2  0xf5f05e5c in QCoreApplication::postEvent(QObject*, QEvent*) () from /space/cp/x86/qt/lib/libQtCore.so.4
3  0xf5f15ce7 in QObject::deleteLater() () from /space/cp/x86/qt/lib/libQtCore.so.4
4  0xf62ccb00 in ?? () from /space/cp/x86/qt/lib/libQtGui.so.4
5  0xf62b31d2 in QApplication::x11ClientMessage(QWidget*, _XEvent*, bool) () from /space/cp/x86/qt/lib/libQtGui.so.4
6  0xf62bfd04 in QApplication::x11ProcessEvent(_XEvent*) () from /space/cp/x86/qt/lib/libQtGui.so.4
7  0xf62e834f in ?? () from /space/cp/x86/qt/lib/libQtGui.so.4
8  0xf5f0480a in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /space/cp/x86/qt/lib/libQtCore.so.4
9  0xf5f04c52 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /space/cp/x86/qt/lib/libQtCore.so.4
10 0xf5f06f69 in QCoreApplication::exec() () from /space/cp/x86/qt/lib/libQtCore.so.4
11 0xf6238887 in QApplication::exec() () from /space/cp/x86/qt/lib/libQtGui.so.4
12 0x0805d028 in main (argc=138177832, argv=0x83cf3b0) at /home/bbayes/DspGUI/main.cpp:10
  

На Interactive удаляемый больше не ссылается ни один из моих кодов. Эта ошибка выглядит полностью внутренней для Qt. Я поискал в Интернете, но не смог найти похожий пример или решение. У кого-нибудь есть идеи, как решить эту проблему?

Ответ №1:

В документе Qt говорится, что qobject_cast:

Возвращает приведение данного объекта к типу T, если объект имеет тип T (или подкласса); в противном случае возвращает 0.

Проверьте, работает ли ваше приведение или нет, прежде чем пытаться удалить объект, как показано ниже :

 Interactive *temp = (qobject_cast<Interactive*>(event->source()));
if (temp != NULL)
{
   temp->deleteLater();
}
  

Ответ №2:

Вы не можете удалить событие-> источник события. Я обошел это, добавив event-> source в список, который будет удален позже, как только это событие будет завершено.