2017-10-29 99 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