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