QML QQQQuickItemマウスイベントの処理

5841 ワード

QtQuickを使用すると、QMLとC++がマウスイベントを処理できるため、面倒になります.私の今の経験から見れば、両者は共存できない.他のものを手動で呼び出さない限り.
QMLマウスイベント処理
まずQMLのマウスイベント処理について,処理されたイベントはC++と同様にclicked,pressed,releaseのように,これ以上述べない.例は次のとおりです.
Rectangle {
    id: rect
    MouseArea{
        anchors.fill: parent //MouseArea  Item,             ,       0X0
        onClicked:{
            rect.doSomething()
            //      "       ".doSometing()
        }
    }
}

C++マウスイベント処理
Qt C++マウスイベントは、Qtを使ったことのある人はよく知っていると思いますが、QtQuickでC++オブジェクトを使ってマウスイベントを処理するのはちょっと面倒です.例として、
// main.cpp
#include 
#include 
#include 
class MyItem : public QQuickItem
{
public:
    MyItem()
    {
        //   3  C++         ,    (C++)        
        setAcceptHoverEvents(true);
        setAcceptedMouseButtons(Qt::AllButtons);
        setFlag(ItemAcceptsInputMethod, true);
    }

    void mousePressEvent(QMouseEvent* event)
    {
        //                ,            !!!
        //  QQuickItem::mousePressEvent()      event->ignore(),       mouseMove mouseRelease      
        //QQuickItem::mousePressEvent(event);
        qDebug() << event->pos();
    }
    void mouseMoveEvent(QMouseEvent* event)
    {
        //                ,            !!!
        //  QQuickItem::mouseMoveEvent()      event->ignore(),       mouseRelease      
        //QQuickItem::mouseMoveEvent(event);
        qDebug() << event->pos();
    }
    void mouseReleaseEvent(QMouseEvent* event)
    {
        //                ,            !!!
        //QQuickItem::mouseReleaseEvent(event);
        qDebug() << event->pos();
    }


    //  MouseMoveEvent   !!!
    //       ,mouseMoveEvent(QMouseEvent*)    。
    void hoverMoveEvent(QHoverEvent* event) {
        QQuickItem::hoverMoveEvent(event);
        qDebug() << event->pos();
    }
};

int main(int argc, char** argv)
{
    QGuiApplication app(argc, argv);
    QQuickView* view = new QQuickView;
    qmlRegisterType("Test", 1, 0, "MyItem");
    view->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view->show();
    return app.exec();
}

あとQML部分
import QtQuick 2.4
import QtQuick.Controls 1.3
import Test 1.0

Rectangle {
    width: 400; height: 400; visible: true
    MyItem { //         MouseArea,  C++         
        anchors.fill: parent
    }
    Button { x: 100;  y: 100; text: "Button" }
}

マウスイベントを親に渡すには
Rectangle{
    MouseArea{//     item   pressed  
    }
    MyItem {id: item
        MouseArea {onPressed: {
            mouse.accepted = false;
    }}
}

リファレンスhttp://stackoverflow.com/questions/30281955/catch-mousemoveevent-on-qt5s-qquickitem http://stackoverflow.com/questions/23986201/mouse-events-not-handled-within-qquickitem-inheritor http://stackoverflow.com/questions/18864420/handling-mouse-events-on-a-qquickitemhttp://stackoverflow.com/questions/29772736/qquickpainteditem-mousereleaseevent-gets-only-called-after-doubleclick