Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Accessing QQuickItem Transform object from C++ ?



  • Hello, I am writing a custom QQuickItem derived class in C++ and registering it in QML to use in my Scene Graph based scene. It's very simple as I'm testing things out yet, here is my QML declaration for my object:

    Hexagon {
            id: hexa0
            anchors.fill: parent
            anchors.margins: 20
            
            transform: Translate {
                x: 200
                y: 200
            }
        }
    

    And here is my code for drawing this item:

    QSGNode *Hexagon::updatePaintNode(QSGNode *old_node, UpdatePaintNodeData *) {
    	qDebug() << "updatePaintNode";
    
    	QSGGeometryNode *node = 0;
    	QSGGeometry *geometry = 0;
    
    	if (old_node == nullptr) {
    		node = new QSGGeometryNode;
    
    		geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), _num_points);
    		geometry->setLineWidth(3);
    		geometry->setDrawingMode(QSGGeometry::DrawLineLoop);
    
    		node->setGeometry(geometry);
    		node->setFlag(QSGNode::OwnsGeometry);
    
    		QSGFlatColorMaterial *material = new QSGFlatColorMaterial;
    		material->setColor(QColor(0, 0, 255));
    		node->setMaterial(material);
    		node->setFlag(QSGNode::OwnsMaterial);
    	} else {
    		node = static_cast<QSGGeometryNode *>(old_node);
    		geometry = node->geometry();
    		geometry->allocate(_num_points);
    	}
    
    	QSGGeometry::Point2D *vertices = geometry->vertexDataAsPoint2D();
    
    	float angle_offset = 0.0f;
    	float angle_inc = 2*M_PI / _num_points;
    	float angle_rad = qDegreesToRadians(angle_offset);
    
    	for (int i=0; i<_num_points; i++) {
    		float x = sin(angle_rad) * _radius;
    		float y = cos(angle_rad) * _radius;
    
    		vertices[i].set(x, y);
    
    		angle_rad += angle_inc;
    	}
    
    	node->markDirty(QSGNode::DirtyGeometry);
    
    	return node;
    }
    

    Now, I would like to transform this object from my C++ code. I cannot seem to find how to access the QML declared Transform object in such a way from C++ that I could just do something like transform.setPos(origin.x, origin.y);

    How can I access and set this transform object from the updatePaintNode() method ?
    Thank you!



  • Okay found out the solution, calling setX() and setY() and so also that I removed the anchors from the QML code, now setting translation works! Didn't realize the anchors prevented setX() and setY() from working.


Log in to reply