2016-04-25 13 views
0

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 
      } 
     } 
    } 
} 
+0

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

+0

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

+0

Und bitte nicht ein Bild von der Festplatte bei jedem Repaint laden! – peppe

Antwort

0

Okey. Ich habe eine Lösung gefunden. Scheint so, als müsste ich MyImage Element anchors.fill: parent machen. Oder legen Sie Breite und Höhe gleich der Elterngröße fest. Danach wird es malen jeden Größenänderung Fenster Moment!