继承QQuickPaintedItem
头文件:PaintItem.h
#include <QQuickPaintedItem>
#include <QImage>
#include <QPainter>
class PaintItem : public QQuickPaintedItem
{
Q_OBJECT
public:
explicit PaintItem(QQuickItem *parent = nullptr);
public slots:
void updateImage(const QImage &);
protected:
void paint(QPainter *painter);
private:
QImage m_imageThumb;
};
实现:PaintItem.cpp
#include "paintitem.h"
PaintItem::PaintItem(QQuickItem *parent) : QQuickItem(parent)
{
//默认图片
m_imageThumb = QImage(":/Image/background.png");
}
void PaintItem::updateImage(const QImage &image)
{
m_imageThumb = image;
update();
}
void PaintItem::paint(QPainter *painter)
{
painter->drawImage(this->boundingRect(), m_imageThumb);
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "paintitem.h"
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QGuiApplication app(argc, argv);
//注册类
qmlRegisterType<PaintItem>("PaintItemModule",1,0,"PaintItem");
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
Qml文件text.qml
import QtQuick 2.12
import QtQuick.Controls 2.5
import PaintItemModule 1.0
Rectangle {
id: rectangle
anchors.fill: parent
PaintItem {
id: paintItem
transformOrigin: Item.Center
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
}
继承QQuickItem重写updatePaintNode
头文件:PaintItem.h
#include <QQuickItem>
#include <QSGNode>
#include <QSGSimpleRectNode>
#include <QSGSimpleTextureNode>
#include <QQuickWindow>
#include <QImage>
class PaintItem : public QQuickItem
{
Q_OBJECT
public:
explicit PaintItem(QQuickItem *parent = nullptr);
public slots:
void updateImage(const QImage &);
protected:
QSGNode * updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override;
private:
QImage m_imageThumb;
};
实现PaintItem.cpp
#include "paintitem.h"
PaintItem::PaintItem(QQuickItem *parent) : QQuickItem(parent)
{
//这句不加会报错
setFlag(ItemHasContents, true);
//默认图片
m_imageThumb = QImage(":/Image/background.png");
}
void PaintItem::updateImage(const QImage &image)
{
m_imageThumb = image;
update();
}
QSGNode * PaintItem::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
{
auto node = dynamic_cast<QSGSimpleTextureNode *>(oldNode);
if(!node){
node = new QSGSimpleTextureNode();
}
QSGTexture *m_texture = window()->createTextureFromImage(m_imageThumb, QQuickWindow::TextureIsOpaque);
node->setOwnsTexture(true);
node->setRect(boundingRect());
node->markDirty(QSGNode::DirtyForceUpdate);
node->setTexture(m_texture);
return node;
}