如何从qml Keys.oPressed调用qt keyPressEvent(QKeyEvent*事件)



我有一个qml窗口,其中包含一个具有的Item

Keys.onPressed {
}  

我有一个c++类,它有

protected:  
void keyPressEvent(QKeyEvent *event);  

钥匙里面需要什么。按下?我试过

myclass.keyPressEvent(event)

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

在运行时,前者给出

"TypeError:对象myclass的属性'keyPressEvent'不是功能">

后一种

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

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

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

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

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)

最新更新