2017-10-29 1 views
0

Ich habe mehrere ähnliche Fragen zu diesem Thema gefunden, aber noch nicht eine funktionierende Lösung zusammengefügt. Ich habe nicht-rechteckige Qt Quick Images, jedes mit einem Kind MouseArea. Das aktuelle onClicked-Ereignis registriert Klicks des übergeordneten Bilds in Transparenzbereichen, die ich gerne ignorieren würde. Gibt es dafür eine QML-Lösung? Wäre eine QML-only-Lösung zu empfehlen oder sollte die Transparenzbestimmung in C++ erfolgen?Ignore MouseArea onClicked-Ereignis für transparente Bereiche von übergeordneten Qt Quick Image

Pseudocode in der main.qml Datei:

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 
      //} 
     } 
    } 
} 

Mein Verständnis ist, dass getImageData() wird für diesen Zweck nicht funktionieren, so kann es nicht möglich sein, die Alpha-Ebene des Mutterbildes zu bestimmen, bei die (mouseX, mouseY) Koordinaten in QML direkt.

+0

Bitte schauen Sie sich Qt doc an. [void QEvent :: ignore()] (http://doc.qt.io/qt-5/qevent.html#ignore). Wenn ich mich recht erinnere, wird ein ignoriertes Ereignis an den nächsten möglichen Empfänger, d. H. Das nächste Widget, gemäß der Stapelreihenfolge z. das übergeordnete Widget – Scheff

+0

Haben Sie einen echten Code, in dem Sie einige der Lösungen im Internet ausprobiert haben? Eine vielversprechende Lösung finden Sie hier: https://stackoverflow.com/questions/38164074/how-to-create-a-round-mouse-area-in-qml (dh zweite Antwort) – derM

+0

Ich denke, das ist nur möglich durch Implementierung von benutzerdefiniertem 'QQuickitem'-Item. – folibis

Antwort

1

Sie können in C++ QImage verwenden, um die Farbe eines Pixels abzufragen.

Eine kurze, sehr unvollständige Lösung (nur die Idee aufwands) wäre dies:

* // 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(); 
    } 
} 

Es ist wahrscheinlich klüger, die QImage als Mitglied und nicht als Basisklasse zu verwenden, aber ich begann als QImage, bis ich erkannte, dass es kein QObject ist.

Wie bereits erwähnt, ist dies keine vollständige Implementierung. Zum Beispiel ist es nicht möglich, die Größe einzustellen, z. um es zu dehnen. Weiter können Sie nicht Item s als Quelle und so weiter nehmen. Es gibt auch keine Kontrolle, ob es mit dem Laden fertig ist ... Aber vielleicht dient dies als Start für Sie.

Sie könnten es sogar als EventFilter an die Item installieren, die anklickbar sein soll, um die MouseEvent s für Relevanz zu filtern.

+1

Entschuldigung für die Verzögerung bei der Antwort, ich hatte erst vor kurzem eine Chance, dieses Problem anzugehen. Ich habe jetzt die Lösung wie erforderlich funktioniert, danke für Ihre Hilfe! – jars121

Verwandte Themen