关于c ++:如何从qml Keys.onPressed调用qt keyPressEvent(QKeyEvent * event)

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

我有一个带有项目的qml窗口

1
2
Keys.onPressed {
}

我有一个C ++类

1
2
protected:  
    void keyPressEvent(QKeyEvent *event);

什么需要进入Keys.onPressed内部? 我试过了

1
myclass.keyPressEvent(event)

并且我在我的c ++类中尝试了一个带有参数(QKeyEvent * event)的公共Q_INVOKABLE函数(handleKeyPress),我想从中调用keyPressEvent。

在运行时,前者给出

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

后者

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

(然后我发现qml只能处理指向QObject的指针,并且QKeyEvent不能从QObject继承,但这无助于我寻找解决方案。)

那么从qml获取keyPressEvent的正确方法是什么? 或者如果这完全是错误的方法,那么如果我的班级需要QKeyEvent可以像按下哪个键等给我信息的话,正确的方法是什么?


KeyEvent不是QKeyEvent *,而是从QObject继承并封装QKeyEvent的类,因此无法访问QKeyEvent,但是可以访问q属性,如下所示:

C ++

1
2
3
4
5
6
7
8
9
10
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:

1
Keys.onPressed: myclass_obj.someMethod(event)

但是不建议这样做。 您的类不应直接知道事件,但最好的事情是您处理QML中的逻辑以及该函数:

1
2
3
4
5
6
7
8
Keys.onPressed: {
    if(event.key === Qt.Key_A){
        myclass_obj.foo_A()
    }
    else if(event.key === Qt.Key_B){
        myclass_obj.foo_B()
    }
}

或者,如果您只想知道密钥,则如下所示

C ++

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

QML

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