首页 > 解决方案 > 如何从 qml Keys.onPressed 调用 qt keyPressEvent(QKeyEvent *event)

问题描述

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

Keys.onPressed {
}  

我有一个 c++ 类

protected:  
    void keyPressEvent(QKeyEvent *event);  

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

myclass.keyPressEvent(event)

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

在运行时,前者给出

“TypeError:对象 myclass 的属性‘keyPressEvent’不是函数”

后者

“错误:未知方法参数类型:QKeyEvent*”。

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

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

标签: c++qtqmlqt5qkeyevent

解决方案


KeyEvent不是 a QKeyEvent *,而是继承自QObject并封装 a的类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)

但不建议这样做。你的类不应该直接知道事件,但最好的事情是你处理 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)

推荐阅读