add weird hack to paint quick item on TreeView
3 files changed, 108 insertions(+), 3 deletions(-)

M CMakeLists.txt
M quickitemdelegate.cpp
M quickitemdelegate.h
M CMakeLists.txt +2 -2
@@ 24,7 24,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
 #    endif()
 #endif()
 
-find_package(Qt5 COMPONENTS Widgets REQUIRED)
+find_package(Qt5 COMPONENTS Quick Widgets REQUIRED)
 
 if(ANDROID)
   add_library(quick-itemview SHARED

          
@@ 46,4 46,4 @@ else()
   )
 endif()
 
-target_link_libraries(quick-itemview PRIVATE Qt5::Widgets)
+target_link_libraries(quick-itemview PRIVATE Qt5::Quick Qt5::Widgets)

          
M quickitemdelegate.cpp +91 -1
@@ 1,14 1,104 @@ 
+#include <QByteArray>
+#include <QOpenGLContext>
 #include <QPainter>
+#include <QQmlComponent>
+#include <QQmlContext>
+#include <QQmlEngine>
+#include <QQuickItem>
+#include <QQuickRenderControl>
+#include <QQuickWindow>
+#include <QString>
+#include <QSurfaceFormat>
+#include <QUrl>
+#include <QtDebug>
 #include "quickitemdelegate.h"
 
 QuickItemDelegate::QuickItemDelegate(QObject *parent)
-    : QStyledItemDelegate(parent)
+    : QStyledItemDelegate(parent),
+      engine_(new QQmlEngine(this)),
+      component_(new QQmlComponent(engine_, this)),
+      //renderControl_(new QQuickRenderControl(this)),
+      window_(std::make_unique<QQuickWindow>(/*renderControl_*/))
 {
+    // XXX
+    /*
+    auto *glContext = new QOpenGLContext(this);
+    QSurfaceFormat format;
+    format.setDepthBufferSize(16);
+    format.setStencilBufferSize(8);
+    window_->setFormat(format);
+    glContext->setFormat(format);
+    glContext->create();
+    //glContext->makeCurrent();
+    renderControl_->initialize(glContext);
+    */
+
+    // XXX
+    auto *context = engine_->rootContext();
+    context->setContextProperty(QStringLiteral("itemIndex"), {});
+    context->setContextProperty(QStringLiteral("itemText"), {});
+
+    component_->setData(QByteArrayLiteral(R"(
+        import QtQuick 2.12
+
+        Row {
+            anchors.fill: parent
+            spacing: 4
+            leftPadding: 4
+            rightPadding: 4
+
+            Rectangle {
+                anchors.verticalCenter: parent.verticalCenter
+                width: indexText.width + 4
+                height: indexText.height + 4
+                color: "#ccc"
+                Text {
+                    id: indexText
+                    anchors.centerIn: parent
+                    text: "#" + itemIndex
+                }
+            }
+
+            Text {
+                anchors.verticalCenter: parent.verticalCenter
+                text: itemText
+            }
+        }
+        )"), QUrl());  // TODO
+
+    // XXX, memleak, async
+    auto *item = qobject_cast<QQuickItem *>(component_->create());
+    Q_ASSERT(item);
+    item->setParentItem(window_->contentItem());
+    window_->create();
+    window_->resize(100, 28);
 }
 
+QuickItemDelegate::~QuickItemDelegate() = default;
+
 void QuickItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                               const QModelIndex &index) const
 {
+    window_->resize(option.rect.size());
+    auto *context = engine_->rootContext();
+    context->setContextProperty(QStringLiteral("itemIndex"), index.row());
+    context->setContextProperty(QStringLiteral("itemText"), index.data());
+    /*
+    renderControl_->polishItems();
+    renderControl_->sync();
+    renderControl_->render();
+    */
     painter->save();
+    painter->setClipRect(option.rect);
+    // TODO: synchronized?
+    painter->drawImage(option.rect.left(), option.rect.top(), window_->grabWindow());
+    //painter->drawImage(0, 0, renderControl_->grab());
     painter->restore();
 }
+
+QSize QuickItemDelegate::sizeHint(const QStyleOptionViewItem &/*option*/,
+                                  const QModelIndex &/*index*/) const
+{
+    // TODO
+    return window_->size();
+}

          
M quickitemdelegate.h +15 -0
@@ 2,14 2,29 @@ 
 #define QUICKITEMDELEGATE_H
 
 #include <QStyledItemDelegate>
+#include <memory>
+
+class QQmlComponent;
+class QQmlEngine;
+class QQuickRenderControl;
+class QQuickWindow;
 
 class QuickItemDelegate : public QStyledItemDelegate
 {
 public:
     explicit QuickItemDelegate(QObject *parent = nullptr);
+    ~QuickItemDelegate() override;
 
     void paint(QPainter *painter, const QStyleOptionViewItem &option,
                const QModelIndex &index) const override;
+    QSize sizeHint(const QStyleOptionViewItem &option,
+                   const QModelIndex &index) const override;
+
+private:
+    QQmlEngine *engine_;
+    QQmlComponent *component_;
+    QQuickRenderControl *renderControl_;
+    std::unique_ptr<QQuickWindow> window_;
 };
 
 #endif // QUICKITEMDELEGATE_H