2017-10-29 122 views
0

我发现了几个与此主题有关的类似问题,但还没有拼凑出一个可行的解决方案。我有非矩形的Qt Quick Images,每个都有一个MouseArea子元素。当前的onClicked事件在透明区域注册父图像的点击,我想忽略这些区域。是否有只有QML的解决方案才能做到这一点?只有QML解决方案可以提供建议,还是应该使用C++完成透明度确定?忽略MouseArea onClicked事件的父母的透明区域Qt快速图像

伪代码在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()不会达到这个目的,所以它可能无法确定在父图像的Alpha水平直接在QML中调用(mouseX,mouseY)坐标。

+0

请看看Qt文档。 [void QEvent :: ignore()](http://doc.qt.io/qt-5/qevent.html#ignore)。如果我没有记错,忽略的事件被传递给下一个潜在的接收者,即根据堆叠顺序例如下一个小部件。父窗口小部件。 – Scheff

+0

你有没有真正的代码,你在网上尝试了一些解决方案?一个非常有前途的解决方案可以在这里找到:https://stackoverflow.com/questions/38164074/how-to-create-a-round-mouse-area-in-qml(即第二个答案) – derM

+0

我想这可能只有通过实现自定义的'QQuickitem' iitem。 – folibis

回答

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的相关性。

+1

对不起,我最近才有机会解决这个问题。我现在已经根据需要提供了解决方案,谢谢你的帮助! – jars121