2016-04-25 478 views
0

我将非常感谢您的帮助!Qt5和QML:小部件调整大小后如何更新QQuickPaintedItem?

我创建了一个自定义对象,继承自QQuickPaintedItem并将其发送给QML应用程序。

它很好,但有一些问题。

每次小部件更改它自己的大小时,我都需要重新绘制缩放图像。 但我不明白如何在C++中使用它。它只调用一次paint方法。

有什么建议吗?

源代码: 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 
      } 
     } 
    } 
} 
Okey。
+0

你是什么意思“改变自己的大小”?上次检查时,调整项目大小时会自动调用paint()函数。 – Mitch

+0

好吧,当我插入qDebug <<“绘画!”进入油漆方法它只被打印一次 - 在开始。 如果我改变应用程序窗口的宽度或高度,它会像鱼一样沉默。 – ArcticNoise

+0

请不要在每次重新绘制时从磁盘加载图像! – peppe

回答

0

Okey。我找到了一个解决方案。似乎我需要制作MyImage元素anchors.fill:parent。或设置宽度和高度等于父母的大小。 之后,它会调用每一个调整窗口大小的时刻油漆!

相关问题