我有一个qml窗口,其中的一个项目具有
Keys.onPressed {
}
我有一个
的c ++类protected:
void keyPressEvent(QKeyEvent *event);
在Keys.onPressed中需要放入什么?我尝试过
myclass.keyPressEvent(event)
,并且在我的c ++类中尝试了带有参数(QKeyEvent *事件)的公共Q_INVOKABLE函数(handleKeyPress),我想从中调用 keyPressEvent 。
在运行时,前者给出
“ TypeError:对象myclass的属性'keyPressEvent'不是 功能”
后者
“错误:未知的方法参数类型:QKeyEvent *”。
(然后我发现qml只能处理指向QObject的指针,并且QKeyEvent不能从QObject继承,但这无助于我寻找解决方案。)
那么从qml调用keyPressEvent的正确方法是什么?或者如果这完全是错误的方法,那么如果我的班级需要QKeyEvent可以像按下哪个键之类的信息给我,那么正确的方法是什么?
答案 0 :(得分:0)
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)