# HG changeset patch # User Yuya Nishihara # Date 1579330216 -32400 # Sat Jan 18 15:50:16 2020 +0900 # Node ID fe975725df040c5672ff3ae8583edd330e7ac703 # Parent 9a37651f04bc4a508b02903e21ac21f70e027fa1 add weird hack to paint quick item on TreeView diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,7 @@ # 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 @@ ) endif() -target_link_libraries(quick-itemview PRIVATE Qt5::Widgets) +target_link_libraries(quick-itemview PRIVATE Qt5::Quick Qt5::Widgets) diff --git a/quickitemdelegate.cpp b/quickitemdelegate.cpp --- a/quickitemdelegate.cpp +++ b/quickitemdelegate.cpp @@ -1,14 +1,104 @@ +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #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(/*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(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(); +} diff --git a/quickitemdelegate.h b/quickitemdelegate.h --- a/quickitemdelegate.h +++ b/quickitemdelegate.h @@ -2,14 +2,29 @@ #define QUICKITEMDELEGATE_H #include +#include + +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 window_; }; #endif // QUICKITEMDELEGATE_H