如何从 qml Keys.onPressed 调用 qt keyPressEvent(QKeyEvent *event)

How to call qt keyPressEvent(QKeyEvent *event) from qml Keys.onPressed

我有一个 qml Window,其中一个项目有

Keys.onPressed {
}  

我有一个 c++ class 有

protected:  
    void keyPressEvent(QKeyEvent *event);  

Keys.onPressed里面需要放什么?我试过了

myclass.keyPressEvent(event)

并且我在我的 c++ class 中尝试了一个 public Q_INVOKABLE 函数 (handleKeyPress),参数 (QKeyEvent * event) 来自我想调用 keyPressEvent

在运行时,前者给出

"TypeError: Property 'keyPressEvent' of object myclass is not a function"

后者

"Error: Unknown method parameter type: QKeyEvent*".

(后来我发现qml只能处理指向QObject的指针,而QKeyEvent并没有继承自QObject,但这并不能帮助我找到解决方案。)

那么从qml中调用keyPressEvent的正确方法是什么?或者,如果这完全是错误的方法,如果我的 class 需要 QKeyEvent 可以给我的信息,比如按下了哪个键等,那么正确的方法是什么?

KeyEvent不是一个QKeyEvent *,而是一个class,继承了QObject,封装了一个QKeyEvent,所以QKeyEvent可以无法访问,但您可以访问 q-properties,如下所示:

C++

protected:
    Q_INVOKABLE void someMethod(QObject *event){
        qDebug()<< "key" << event->property("key").toInt();
        qDebug()<< "text" << event->property("text").toString();
        qDebug()<< "modifiers" << event->property("modifiers").toInt();
        qDebug()<< "isAutoRepeat" << event->property("isAutoRepeat").toBool();
        qDebug()<< "count" << event->property("count").toInt();
        qDebug()<< "nativeScanCode" << event->property("nativeScanCode").value<quint32>();
        qDebug()<< "accepted" << event->property("accepted").toBool();
    }

QML:

Keys.onPressed: myclass_obj.someMethod(event)

但不推荐这样做。你的 class 不应该直接知道事件,但最好的是你处理 QML 中的逻辑和函数:

Keys.onPressed: {
    if(event.key === Qt.Key_A){
        myclass_obj.foo_A()
    }
    else if(event.key === Qt.Key_B){
        myclass_obj.foo_B()
    }
}

或者如果你只想知道密钥可以如下

C++

Q_INVOKABLE void someMethod(int key){
    qDebug()<< key;
}

QML

Keys.onPressed: myclass_obj.someMethod(event.key)