PDA

View Full Version : Showing QDialog in eventFilter()



JPNaude
29th November 2010, 09:28
Hi

I'm wondering if it is a good idea to show a QDialog() in an event filter. I've recently been seeing crashes as soon as I call exec() on a dialog. I show the dialog by simply calling exec() on it. The code below is called as the result of a drop operation on a QTreeView which I catch in the event filter:



if (d->name_dialog->exec()) { // Crashes here (line 58 in the stack trace below)
if (d->name_dialog->selectedResolution() == Reject)
return_value = false;
else
return_value = true;


Is this a basic mistake? If so what is the correct way to show a dialog in a event filter?

Thanks,
Jaco



0 qt_blend_argb32_on_argb32_sse2 emmintrin.h 1239 0x5931e8
1 QRasterPaintEnginePrivate::drawImage qpaintengine_raster.cpp 1067 0x73117f
2 QRasterPaintEngine::drawImage qpaintengine_raster.cpp 2761 0x739db9
3 QRasterPaintEngine::drawPixmap qpaintengine_raster.cpp 2419 0x737a8c
4 QPainter::drawPixmap qpainter.cpp 5387 0x6c9051
5 QPainter::drawPixmap qpainter.h 847 0xd09223
6 QPixmapIconEngine::paint qicon.cpp 146 0x62bb61
7 QIcon::paint qicon.cpp 722 0x62e1dc
8 QCommonStyle::drawControl qcommonstyle.cpp 2194 0x8406b3
9 QWindowsStyle::drawControl qwindowsstyle.cpp 2560 0x90c907
10 QStyleSheetStyle::drawControl qstylesheetstyle.cpp 3979 0x8766a6
11 QStyledItemDelegate::paint qstyleditemdelegate.cpp 424 0xb1326f
12 QListView::paintEvent qlistview.cpp 1044 0xa9ef69
13 QWidget::event qwidget.cpp 8333 0x5f492d
14 QFrame::event qframe.cpp 557 0x96e6bc
15 QAbstractScrollArea::viewportEvent qabstractscrollarea.cpp 1043 0x9fbf0f
16 QAbstractItemView::viewportEvent qabstractitemview.cpp 1619 0xa85785
17 QAbstractScrollAreaPrivate::viewportEvent qabstractscrollarea_p.h 100 0xc56a13
18 QAbstractScrollAreaFilter::eventFilter qabstractscrollarea_p.h 116 0xc5506c
19 QCoreApplicationPrivate::sendThroughObjectEventFil ters qcoreapplication.cpp 847 0x6a1ffc73
20 QApplicationPrivate::notify_helper qapplication.cpp 4392 0x5a96e5
21 QApplication::notify qapplication.cpp 4361 0x5a9586
22 QCoreApplication::notifyInternal qcoreapplication.cpp 732 0x6a1ff9dc
23 QCoreApplication::sendSpontaneousEvent qcoreapplication.h 218 0xc1d53e
24 QWidgetPrivate::drawWidget qwidget.cpp 5420 0x5ed460
25 QWidgetPrivate::paintSiblingsRecursive qwidget.cpp 5627 0x5ee176
26 QWidgetPrivate::drawWidget qwidget.cpp 5473 0x5ed8ab
27 QWidgetPrivate::paintSiblingsRecursive qwidget.cpp 5627 0x5ee176
28 QWidgetPrivate::paintSiblingsRecursive qwidget.cpp 5614 0x5ee036
29 QWidgetPrivate::drawWidget qwidget.cpp 5473 0x5ed8ab
30 QWidgetPrivate::paintSiblingsRecursive qwidget.cpp 5627 0x5ee176
31 QWidgetPrivate::paintSiblingsRecursive qwidget.cpp 5614 0x5ee036
32 QWidgetPrivate::drawWidget qwidget.cpp 5473 0x5ed8ab
33 QWidgetBackingStore::sync qbackingstore.cpp 1320 0x774a5d
34 QWidgetPrivate::syncBackingStore qwidget.cpp 1805 0x5e4f50
35 QWidget::event qwidget.cpp 8480 0x5f4e75
36 QMainWindow::event qmainwindow.cpp 1417 0x98d23a
37 QApplicationPrivate::notify_helper qapplication.cpp 4396 0x5a9706
38 QApplication::notify qapplication.cpp 4361 0x5a9586
39 QCoreApplication::notifyInternal qcoreapplication.cpp 732 0x6a1ff9dc
40 QCoreApplication::sendEvent qcoreapplication.h 215 0xc1d592
41 sendUpdateRequest qbackingstore.cpp 507 0x771578
42 QWidgetBackingStore::markDirty qbackingstore.cpp 683 0x7721ba
43 QWidget::repaint qwidget.cpp 10237 0x5f778d
44 QWidget::repaint qwidget.cpp 10193 0x5f75b3
45 setDisabledStyle qwidget.cpp 8106 0xbd8a3e
46 QWidget::event qwidget.cpp 8502 0x5f4f6d
47 QMainWindow::event qmainwindow.cpp 1417 0x98d23a
48 QApplicationPrivate::notify_helper qapplication.cpp 4396 0x5a9706
49 QApplication::notify qapplication.cpp 4361 0x5a9586
50 QCoreApplication::notifyInternal qcoreapplication.cpp 732 0x6a1ff9dc
51 QCoreApplication::sendEvent qcoreapplication.h 215 0xc1d592
52 QApplicationPrivate::enterModal qapplication.cpp 2906 0x5a5a45
53 QWidgetPrivate::show_helper qwidget.cpp 7372 0x5f271b
54 QWidget::setVisible qwidget.cpp 7589 0x5f2f2d
55 QDialog::setVisible qdialog.cpp 739 0xa37528
56 QWidget::show qwidget.h 487 0xd08378
57 QDialog::exec qdialog.cpp 543 0xa36bbf
58 Qtilities::CoreGui::NamingPolicyFilter::validateNa mePropertyChange NamingPolicyFilter.cpp 679 0x9374d93
59 Qtilities::CoreGui::NamingPolicyFilter::initialize Attachment NamingPolicyFilter.cpp 282 0x93703e3
60 Qtilities::Core::Observer::attachSubject Observer.cpp 866 0x6d0d7df5
61 FirmwareCore::Design::addDesignFile Design.cpp 493 0x6fcd69e8
62 FirmwareCore::DesignManager::addFileToDesign DesignManager.cpp 711 0x6fcd0481
63 FirmwareCore::DesignWidget::eventFilter DesignWidget.cpp 352 0x6fce8980
64 QCoreApplicationPrivate::sendThroughObjectEventFil ters qcoreapplication.cpp 847 0x6a1ffc73
65 QApplicationPrivate::notify_helper qapplication.cpp 4392 0x5a96e5
66 QApplication::notify qapplication.cpp 4202 0x5a89ed
67 QCoreApplication::notifyInternal qcoreapplication.cpp 732 0x6a1ff9dc
68 QCoreApplication::sendEvent qcoreapplication.h 215 0xc1d592
69 QOleDropTarget::Drop qdnd_win.cpp 819 0x617326
70 ole32!StgGetIFillLockBytesOnFile C:\WINDOWS\system32\ole32.dll 0 0x775f8ec6
71 ole32!StgGetIFillLockBytesOnFile C:\WINDOWS\system32\ole32.dll 0 0x775f9108
72 ole32!CreateErrorInfo C:\WINDOWS\system32\ole32.dll 0 0x775cfce8
73 ole32!CreateErrorInfo C:\WINDOWS\system32\ole32.dll 0 0x775cfb70
74 QDragManager::drag qdnd_win.cpp 942 0x617851
75 QDrag::exec qdrag.cpp 284 0x5b2b90
76 QAbstractItemView::startDrag qabstractitemview.cpp 3437 0xa8d56a
77 QAbstractItemView::mouseMoveEvent qabstractitemview.cpp 1700 0xa85f7f
78 QTreeView::mouseMoveEvent qtreeview.cpp 1902 0xabcc04
79 QWidget::event qwidget.cpp 8172 0x5f4164
80 QFrame::event qframe.cpp 557 0x96e6bc
81 QAbstractScrollArea::viewportEvent qabstractscrollarea.cpp 1043 0x9fbf0f
82 QAbstractItemView::viewportEvent qabstractitemview.cpp 1619 0xa85785
83 QTreeView::viewportEvent qtreeview.cpp 1256 0xab9aa3
84 QAbstractScrollAreaPrivate::viewportEvent qabstractscrollarea_p.h 100 0xc56a13
85 QAbstractScrollAreaFilter::eventFilter qabstractscrollarea_p.h 116 0xc5506c
86 QCoreApplicationPrivate::sendThroughObjectEventFil ters qcoreapplication.cpp 847 0x6a1ffc73
87 QApplicationPrivate::notify_helper qapplication.cpp 4392 0x5a96e5
88 QApplication::notify qapplication.cpp 3959 0x5a7909
89 QCoreApplication::notifyInternal qcoreapplication.cpp 732 0x6a1ff9dc
90 QCoreApplication::sendSpontaneousEvent qcoreapplication.h 218 0xc1d53e
91 QApplicationPrivate::sendMouseEvent qapplication.cpp 3056 0x5a6118
92 QETWidget::translateMouseEvent qapplication_win.cpp 3317 0x60fc63
93 QtWndProc@16 qapplication_win.cpp 1657 0x60aaa6
94 USER32!GetDC C:\WINDOWS\system32\user32.dll 0 0x7e418734
95 ?? 0 0x26091e
96 ?? 0 0x200
97 USER32!GetDC C:\WINDOWS\system32\user32.dll 0 0x7e418816
98 qt_is_translatable_mouse_event qapplication_win.cpp 1426 0x609fa5
99 USER32!GetWindowLongW C:\WINDOWS\system32\user32.dll 0 0x7e4189cd
100 ?? 0

wysota
29th November 2010, 09:45
Yes, I think that's something you shouldn't do. I don't know what you are doing but probably you can do it outside an event filter.

franz
29th November 2010, 19:23
If you really think you have to, you should call open() on the dialog, not exec(). exec() starts another event loop leading to all kinds of unpredictable behavior (http://labs.qt.nokia.com/2010/02/23/unpredictable-exec/).