【问题标题】:Qt5 and QML: How to update QQuickPaintedItem after widget resize?Qt5 和 QML:如何在小部件调整大小后更新 QQuickPaintedItem?
【发布时间】:2016-08-18 17:42:51
【问题描述】:

非常感谢您的帮助!

我创建了一个自定义对象,继承自 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
            }
        }
    }
}

【问题讨论】:

  • “改变自己的大小”是什么意思? paint() 函数会在我上次检查时在调整项目大小时自动调用。
  • 好吧,当我插入 qDebug
  • 请不要在每次重绘时从磁盘加载图像!

标签: image resize qml qt5 qtquick2


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多