[Interest] [OS X] creating a QDialog from a WId?
René J.V. Bertin
rjvbertin at gmail.com
Tue Dec 8 18:48:34 CET 2015
Thiago Macieira wrote:
> On Tuesday 08 December 2015 17:14:46 René J.V. Bertin wrote:
>> Hello,
>>
>> I'm experiencing a crash in setMainWindow() with the code below (from
>> KF5-kwidgetsaddons). Is this something that is allowed on OS X, and
>> supposed to work?
>>
>> static QDialog *createWIdDialog(WId parent_id)
>> {
>> QWidget *parent = QWidget::find(parent_id);
>> QDialog *dialog = new QDialog(parent, Qt::Dialog);
>> if (!parent && parent_id) {
>> setMainWindow(dialog, parent_id);
>> }
>> return dialog;
>> }
>
> Which line crashes and what's the backtrace of the crash?
>
Backtrace below. I've had a look at my KDE4 library code, and saw that the equivalent function is a noop on OS X. I think that's partly because (at least with Qt4) the WId was usually not what the documentation said it was, but may also have to do with the fact that there are severe restrictions on finding the native window instance that goes with a given WId, on OS X. I think that's what goes on here: the crash occurs in kwalletd5 when kwalletmanager5 requests it to open a wallet via a DBus command. If the WId belongs to kwalletmanager5, it's to be expected that kwalletd5 cannot determine the corresponding native window instance.
So I guess that the partial answer to my question is that "it" is not expected to work in all conditions (or even not expected to work in general). But that doesn't mean the code should crash if it can be avoided in any way.
Should QWidget::find(WId) return a non-null widget for any WId "owned" by an application, or is there a more type-agnostic equivalent mapping function that works for a wider range of WId types (supposing not every WId is a widget)?
R.
* thread #1: tid = 0x77ebf2, 0x00007fff8a130091 libobjc.A.dylib`objc_msgSend + 17, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x7fb829c79540)
frame #0: 0x00007fff8a130091 libobjc.A.dylib`objc_msgSend + 17
frame #1: 0x000000010e4c2889 libqcocoa.dylib`QCocoaWindow::QCocoaWindow(QWindow*) [inlined] QCocoaWindow::setContentView(this=0x00007fc340f4f3c0) + 50 at qcocoawindow.mm:1154
frame #2: 0x000000010e4c2857 libqcocoa.dylib`QCocoaWindow::QCocoaWindow(this=0x00007fc340f4f3c0, tlw=0x00007fc340f4f730) + 903 at qcocoawindow.mm:380
* frame #3: 0x000000010e4bdcb2 libqcocoa.dylib`QCocoaIntegration::createPlatformWindow(this=<unavailable>, window=<unavailable>) const + 34 at qcocoaintegration.mm:434
frame #4: 0x00000001090515cc QtGui`QWindowPrivate::create(this=0x00007fc340f4ff70, recursive=false) + 60 at qwindow.cpp:392
frame #5: 0x0000000109054b3e QtGui`QWindow::fromWinId(unsigned long long) [inlined] QWindow::create(this=0x00007fc340f4f730) + 5 at qwindow.cpp:548
frame #6: 0x0000000109054b39 QtGui`QWindow::fromWinId(id=140428951655744) + 153 at qwindow.cpp:2360
frame #7: 0x000000010843074f libKF5WidgetsAddons.5.dylib`KMessageBox::errorListWId(unsigned long long, QString const&, QStringList const&, QString const&, QFlags<KMessageBox::Option>) [inlined] KMessageBox::setMainWindow(subWidget=0x00007fc340f43c80, mainWindowId=140428951655744) + 28 at kmessagebox.cpp:135
frame #8: 0x0000000108430733 libKF5WidgetsAddons.5.dylib`KMessageBox::errorListWId(unsigned long long, QString const&, QStringList const&, QString const&, QFlags<KMessageBox::Option>) [inlined] KMessageBox::createWIdDialog(parent_id=<unavailable>) + 65 at kmessagebox.cpp:149
frame #9: 0x00000001084306f2 libKF5WidgetsAddons.5.dylib`KMessageBox::errorListWId(parent_id=140428951655744, text=0x00007fff57a4f020, strlist=0x00007fff57a4eb88, caption=0x00007fff57a4f010, options=<unavailable>) + 34 at kmessagebox.cpp:1108
frame #10: 0x0000000108430639 libKF5WidgetsAddons.5.dylib`KMessageBox::errorWId(parent_id=<unavailable>, text=<unavailable>, caption=<unavailable>, options=<unavailable>) + 41 at kmessagebox.cpp:1102
frame #11: 0x000000010825470f libkwalletbackend5.5.dylib`KWallet::GpgPersistHandler::read(this=<unavailable>, wb=<unavailable>, sf=<unavailable>, w=140428951655744) + 319 at backendpersisthandler.cpp:602
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20151208/0ee77f2c/attachment.html>
More information about the Interest
mailing list