Ich bin sehr dankbar für Hilfe!Qt5 und QML: Wie wird QQuickPaintedItem nach der Größenänderung des Widgets aktualisiert?
Ich erstellte ein benutzerdefiniertes Objekt, geerbt von QQuickPaintedItem und sendete es an die QML-Anwendung.
Es geht gut, aber es gibt ein Problem.
Ich muss skalierte Bild jedes Mal neu streichen, wenn Widget seine eigene Größe ändert. Aber ich kann es nicht bekommen, wie man es in C++ macht. Es ruft die Malmethode nur einmal auf.
Irgendwelche Vorschläge?
Quellcode: myimage.h
#ifndef MYIMAGE_H
#define MYIMAGE_H
#include <QQuickPaintedItem>
#include <QQuickItem>
#include <QPainter>
class MyImage : public QQuickPaintedItem
{
Q_OBJECT
public:
explicit MyImage(QQuickItem *parent = 0);
void paint(QPainter* painter) override;
signals:
public slots:
};
#endif // MYIMAGE_H
myimage.cpp
#include "layerimage.h"
MyImage::MyImage(QQuickItem *parent) : QQuickPaintedItem(parent)
{
setImplicitWidth(600);
setImplicitHeight(600);
}
void MyImage::paint(QPainter *painter)
{
QImage firstImage("e:/image1.png");
QImage secondImage("e:/image2.png");
secondImage = secondImage.mirrored(false, true);
firstImage = firstImage.scaled(width(), height(),Qt::KeepAspectRatio);
secondImage = secondImage.scaled(width(), height(),Qt::KeepAspectRatio);
painter->drawImage(0,0, firstImage);
painter->setOpacity(0.5);
painter->drawImage(0,0, secondImage);
}
main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "myimage.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<MyImage>("CustomImage", 1, 0 , "MyImage");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
main.qml
import QtQuick 2.5
import QtQuick.Controls 1.3
import CustomImage 1.0
ApplicationWindow {
visible: true
width: 900
height: 900
minimumWidth: 900
minimumHeight: 480
title: qsTr("Checker")
Rectangle
{
id: image
color: "transparent"
border.color: "red"
anchors
{
margins: 20
centerIn: parent
fill: parent
}
MyImage
{
anchors
{
centerIn: parent
}
}
}
}
Was meinen Sie mit "Ändern der eigenen Größe"? Die Funktion 'paint()' wird automatisch aufgerufen, wenn die Größe des Elements beim letzten Mal geändert wurde. – Mitch
gut, wenn ich qDebug << << Painting! in die Malmethode wurde es nur einmal gedruckt - am Anfang. Wenn ich Breite oder Höhe des Anwendungsfensters ändere, wird es wie ein Fisch still sein. – ArcticNoise
Und bitte nicht ein Bild von der Festplatte bei jedem Repaint laden! – peppe