Important: Please read the Qt Code of Conduct -

QQuickItem* object. "Expression must have class type" when using

  • hi,

    I'm trying to convert this python code in C++

    def setPresetBase( self ):
            object = self.view.rootObject()
            items = object.childItems()
            parameters = []
            for i in items:
                if type(i) == QtQuick.QQuickItem and i.objectName() != "" and i.objectName() != "EditPanel" and i.objectName() != "EditGrid":
                    parameters.append( [ i.objectName(), i.x(), i.y(), i.z(), i.width(), i.height(), i.isVisible() ] )
            self._preset_base = Preset( "base", parameters )

    i started to write this but i can't use w_object, the visual studio tells me that the expression must have a class type. So I can't call childItems().

    void PresetModel::setPresetBase(void)
    			QQuickItem* w_object = mp_view->rootObject();
    			QList<QQuickItem*> w_items = w_object.childItems();

    That's just a pointer so I don't need to allocate any QQuickItem, right ? What's wrong ?

  • Moderators

    I'm not sure, what mp_view is, so I can't say for sure, but my guess is rootObject() returns and actual QObject pointer not a QQuickItem pointer.
    So you'll have to cast it:

    			QQuickItem* w_object = qObject_cast<QQuickItem*> (mp_view->rootObject());
    			QList<QQuickItem*> w_items = w_object.childItems();

  • It's a pointer. Use -> instead of .


  • @J.Hilk
    thanks for your answer.

    mp_view is a QQuickView*

    QQuickView * mp_view;
    PresetModel::PresetModel(QQuickView * aip_view, QObject * aip_parent/*=nullptr by default*/):mp_view(aip_view)

    The documentation says that rootObject returns a QQuickitem* :

    However I tried the qobject_cast and the IDE says
    no instance of overloaded function "qobject_cast" matches the argument list
    arguments are: (QQuickItem*)

    i tried, of course. But because it did not work I tried with the "."
    Anyway, visual studio underlines the error before any compilation. Just by checking the code.

    The error is weird as I can compile

    QQuickItem* w_object = mp_view->rootObject();
       		if (w_object == nullptr);

    But if I try to access to it's attribute... NO !!!

    I can't tell if the pointer is null, there's another error probably not linked.

    int argc = 0; char** argv=nullptr;
    	QGuiApplication(argc, argv);
    	QQuickView* view = new QQuickView();//in console : "QPixmap: Must construct a QGuiApplication before a QPixmap
    	QQmlContext *ctxt = view->rootContext();
    	QQuickItem* w_object = view->rootObject();
    	if (w_object == nullptr)printf("\nthe pointer is null\n");
    	else printf("\nthe pointer is not null\n");
    	QList<QQuickItem*> w_items = w_object->childItems();//got the same error here. w_object underlined

  • Moderators


    possible stupid question, but did you #include <QQuickItem> ?

  • @J.Hilk this is never a stupid question haha

    problem solved. thank you very much

    I didn't know that the program could know the type QQuickItem and compile a QQuickItem* object while missing the include...

  • Moderators

    one of the quirks of c++

    QQuickItem is a forward-declared class

Log in to reply