QPainter example, better performance in compare to canvas

master
Mehran Dehghanian 4 years ago
parent 718bb24889
commit c9c65af940

@ -0,0 +1,27 @@
QT += quick
CONFIG += c++11
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
qquickcustomitem.cpp
RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
HEADERS += \
qquickcustomitem.h

@ -0,0 +1,27 @@
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "qquickcustomitem.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);
QQmlApplicationEngine engine;
qmlRegisterType<QQuickCustomItem>("stackoverflow.qml", 1, 0, "Triangle");
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();
}

@ -0,0 +1,38 @@
import QtQuick 2.15
import QtQuick.Window 2.15
import stackoverflow.qml 1.0
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Rectangle {
width: 200
height: 200
anchors.centerIn: parent
color: "lightgrey"
Triangle {
id: rect
width: 200
height: 202
// transformOrigin: Item.Top
color: "green"
onColorChanged: console.log("color was changed");
// PropertyAnimation on rotation {
// from: 0
// to: 360
// duration: 5000
// loops: Animation.Infinite
// }
}
}
Timer {
interval: 1000
repeat: true
running: true
onTriggered: rect.color = Qt.rgba(Math.random(),Math.random(),Math.random(),1);
}
}

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>

@ -0,0 +1,49 @@
#include "qquickcustomitem.h"
QQuickCustomItem::QQuickCustomItem(QQuickPaintedItem *parent) :
QQuickPaintedItem(parent),
m_color(Qt::red),
m_needUpdate(true)
{
setFlag(QQuickItem::ItemHasContents);
}
void QQuickCustomItem::paint(QPainter *painter)
{
const int scale = 1;
QPen pen;
pen.setWidth(3);
pen.setDashPattern({ 0.0, 1.0 * scale, 1.0 * scale, 1.0 * scale });
pen.setColor(m_color);
QPainterPath path;
// path.moveTo(width() / 2, 0);
// path.lineTo(width(), height());
// path.lineTo(0, height());
// path.lineTo(width() / 2, 0);
qWarning()<<painter->window().width()<<" "<<painter->window().height();
path.moveTo(QPoint(100, 0));
path.arcTo(QRectF(0, 0, painter->window().width(), painter->window().height()), 90, 270);
painter->setPen(pen);
painter->drawPath(path);
}
QColor QQuickCustomItem::color() const
{
return m_color;
}
void QQuickCustomItem::setColor(const QColor &color)
{
if(m_color != color) {
m_color = color;
m_needUpdate = true;
update();
emit colorChanged();
}
}

@ -0,0 +1,29 @@
#ifndef QQUICKCUSTOMITEM_H
#define QQUICKCUSTOMITEM_H
#include <QQuickPaintedItem>
#include <QPainter>
#include <QPainterPath>
class QQuickCustomItem : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
public:
QQuickCustomItem(QQuickPaintedItem *parent = Q_NULLPTR);
protected:
void paint(QPainter *painter);
QColor color() const;
void setColor(const QColor &color);
private:
QColor m_color;
bool m_needUpdate;
signals:
void colorChanged();
};
#endif // QQUICKCUSTOMITEM_H
Loading…
Cancel
Save