忽略父Qt快速图像透明区域的MouseArea onClicked事件

时间:2017-10-29 02:26:26

标签: c++ qt qml

我发现了几个与此主题相关的类似问题,但尚未将可行的解决方案拼凑在一起。我有非矩形Qt快速图像,每个都有一个孩子MouseArea。当前的onClicked事件在透明区域中记录父Image的点击,我想忽略。有没有QML专用的解决方案吗?是否可以建议仅限QML的解决方案,还是应该在c ++中完成透明度确定?

main.qml文件中的伪代码:

Image {
    id: testImage
    x: 200
    y: 100
    width: 100
    height: 150
    fillMode: Image.PreserveAspectFit
    source: "TestImage.svg"

    MouseArea {
        id: testMouseArea
        anchors.fill: parent
        onClicked: {
            //if alpha of (mouseX, mouseY) > 0 {
                //DO STUFF
            //}
        }
    }
}

我的理解是getImageData()不能用于此目的,因此可能无法直接在QML中的(mouseX,mouseY)坐标处确定父图像的alpha级别。

1 个答案:

答案 0 :(得分:1)

您可以在C ++中使用QImage来启用查询像素的颜色。

  

一个简短的,非常不完整的解决方案(只是为了支出这个想法)就是这样:

* // MyMask.h

#ifndef MYMASK_H
#define MYMASK_H

#include <QObject>
#include <QImage>
#include <QString>

class MyMask : public QObject, public QImage
{
    Q_OBJECT
    Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)
public:
    explicit MyMask(QObject *parent = nullptr);

    QString source() const;
    void setSource(const QString &source);

signals:
    void sourceChanged();
public slots:
    QColor color(int x, int y);

private:
    QString m_source;
};

#endif // MYMASK_H

// MyMask.cpp

#include "mymask.h"
#include <QRgb>
#include <QColor>
#include <QDebug>

MyMask::MyMask(QObject *parent)
    : QObject(parent),
      QImage()
{
    QObject::connect(this, &MyMask::sourceChanged, this, [this]() { QImage::load(m_source); });
}

QColor MyMask::color(int x, int y)
{
    return QImage::pixelColor(x, y);
}

QString MyMask::source() const
{
    return m_source;
}

void MyMask::setSource(const QString &source)
{
    if (source != m_source) {
        m_source = source;
        emit sourceChanged();
    }
}

使用QImage作为成员而不是基类可能更明智但我从QImage开始,直到我意识到它不是QObject。

如前所述,这不是完整的实施。例如,不可能调整大小,例如伸展它。此外,您无法将Item作为来源,依此类推。无论是否加载都无法控制......但也许这可以作为一个开始。

您甚至可以将EventFilter作为Item安装到可以点击的MouseEvent,直接过滤SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 1), ',', -1) AS Lookup_1 , SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 2), ',', -1) AS Lookup_2 , SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 3), ',', -1) AS Lookup_3 , SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 4), ',', -1) AS Lookup_4 , SUBSTRING_INDEX(SUBSTRING_INDEX(Lookup_list, ',', 5), ',', -1) AS Lookup_5 FROM [table] 以获取相关性。