[Development] QML, Widgets, and setParent

Konrad Rosenbaum konrad at silmor.de
Sat Nov 2 11:25:07 CET 2013


Hi,

On Saturday 02 November 2013, Kevin Krammer wrote:
> On Thursday, 2013-10-31, 20:17:43, Konrad Rosenbaum wrote:
> > I've got it running
> > for trivial QML files, however as soon as there are child widgets the
> > running program aborts.
> > 
> > The abort is caused by QObject::setParent, which contains this little
> > gem: Q_ASSERT(!d->isWidget);
> 
> Hmm. The same code is in Qt4. I think it "works for me/us" because we are
> building against our distribution's Qt packages which are release builds
> and thus doesn't have the Q_ASSERT.

No, it works for you because the Qt4 QML code (qqmlvme.cpp) contains special 
code to handle Widgets - in Qt5 it was deactivated to remove the dependency 
on the QtWidget module.

The code of QObject::setParent itself is absolutely identical (I didn't 
check all the lines of QObjectPrivate::setParent_helper though). Qt4 
contains the same Q_ASSERT.

> > I kind of ran out of ideas on how to solve this. Should I consider
> > setParent, qqmlvme or the direct use of QWidgets as a bug?
> 
> I agree with Alan on setParent() being in error, the problem is some
> other areas rely on that. E.g. QWidget::parentWidget() does a
> static_cast of parent() to QWidget*

Upon reading the code of QWidget a bit more I must conclude that this was 
done deliberately (both in Qt4 and Qt5). If widgets are supposed to be able 
to have non-widget parents, then this is one hell of a design bug that can't 
be easily fixed inside a single minor release.

I'm coming to the conclusion that I have only three options:

1) give up - I must say, I don't like this one ;-)

2) do a work-around by giving all widget classes a QObject based wrapper in 
the framework: on the plus side this would need no changes to Qt, on the 
down side this would make it slower and use up significantly more memory

3) fix qqmlvme.cpp somehow: the trickiest one, since reintroducing a 
dependency on QtWidgets is not an option; the solution would probably 
involve a plugin that is loaded if/when a widget is encountered there


	Konrad
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 588 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.qt-project.org/pipermail/development/attachments/20131102/9f0c9048/attachment.sig>


More information about the Development mailing list