2011-05-26 113 views
3

我使用OpenSUSE Linux以C++進行編碼,並使用Qt Creator作爲IDE。在dropEvent中刪除QFrame子類時內部QMutex :: lock發生崩潰

我有一個名爲InteractiveQFrame子類,該子類屬於另一個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

不能刪除的事件 - >事件的來源。我通過將event-> source附加到列表中以解決此問題,以便在此事件結束後刪除。

1

Qt的文件說qobject_cast:

返回(或的子類)的給定對象澆鑄到類型T如果對象是類型T的;否則返回0。

檢查你的施法工程或不試圖刪除對象,如下之前:

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