2016-04-25 39 views
0

私は非常に助けに感謝します!Qt5とQML:ウィジェットのサイズ変更後にQQuickPaintedItemを更新するには?

QQuickPaintedItemから継承したカスタムオブジェクトを作成し、それをQMLアプリケーションに送信します。

問題はありますが問題はあります。

ウィジェットが独自のサイズを変更するたびに縮尺変更されたイメージを再描画する必要があります。 しかし、私はCでそれを作る方法を得ることができません+ +。これはpaintメソッドを1回だけ呼び出します。

提案がありますか?

ソースコード: 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

「自分のサイズを変更する」とはどういう意味ですか?前回チェックしたときにアイテムのサイズが変更されると、 'paint()'関数が自動的に呼び出されます。 – Mitch

+0

よく、qDebugを挿入したとき<< <<絵画!ペイント法には最初から一度だけ印刷されていました。 アプリケーションウィンドウの幅や高さを変更すると、魚のように静かになります。 – ArcticNoise

+0

そして、すべての再描画時にディスクからイメージをロードしないでください! – peppe

答えて

0

Okey。私は解決策を見つけました。 MyImage要素anchors.fill:parentを作成する必要があるようです。または、幅と高さを親のサイズに設定します。 その後、サイズ変更ウィンドウのすべての瞬間にpaintが呼び出されます!

関連する問題