QQuickPaintedItem is not rendered in Layout
Solved
QML and Qt Quick
-
Hello everyone, I'm trying to render QQuickPaintedItem in QML. If I set its dimensions using width and height, then everything is fine, but if I put it in layout, then it stops being drawn
import QtQuick 2.15 import QtQuick.Window 2.15 import com.mycompany.messaging 1.0 import QtQuick.Layouts 1.15 Window { width: 640 height: 480 visible: true title: qsTr("Hello World") RowLayout { anchors.fill: parent GraphItem { id : gi objectName: "gI" // Layout.preferredWidth: parent.width / 2 // Layout.preferredHeight: parent.height / 2 // implicitWidth: 10 // implicitHeight: 10 width: 1000 height: 500 // width: parent.width // height: parent.height // anchors.fill: parent } Rectangle { color: "red" Layout.preferredWidth: parent.width / 2 Layout.fillHeight: true } } Connections { target: video function onNewFrame(image, val) { gi.onNewFrame(image) } } }
header
class GraphItem : public QQuickPaintedItem { Q_OBJECT QML_ELEMENT Q_PROPERTY(VideoItem* videoItem READ getVideoItem WRITE setVideoItem) public: GraphItem(QQuickPaintedItem *parent = nullptr) : QQuickPaintedItem(parent) { } QRectF boundingRect() const override{ return _rect; } void paint(QPainter *painter) override { qDebug() << "1111"; painter->drawImage(_rect, _image); } VideoItem * getVideoItem() { return _videoItem; } void setVideoItem(VideoItem* nItem) { connect(nItem, &VideoItem::newFrame, this, &GraphItem::onNewFrame /*,Qt::QueuedConnection*/); if (_videoItem) _videoItem->disconnect(_videoItem, Q_NULLPTR, this, Q_NULLPTR); _videoItem = nItem; } public slots: void onNewFrame(QImage image){ _image = image; // if(this->scene()!=Q_NULLPTR)this->scene()->update(); update(_rect.toRect()); } protected: void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) override { if(change == ItemSceneChange ){ _rect = QRectF(0, 0, width(), height()); } return QQuickPaintedItem::itemChange(change, value); } private: QImage _image; QRectF _rect; VideoItem * _videoItem; };
-
is paint(..) method is called ? Can you confirm.
-
@dheerendra
all the difficulties arise when I set the size via layout -
@GrecKo
Thank you very much, it really helpedvoid geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override { qDebug() << "new geo"; _rect = newGeometry; QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry); // update(); } // void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) override // { // if(change == ItemSceneChange ){ // qDebug() << "lol"; // _rect = QRectF(0, 0, width(), height()); // } // return QQuickPaintedItem::itemChange(change, value); // }
-