我有一个qml窗口,其中有一个
Keys.onPressed {
} 我有一个c++类
protected:
void keyPressEvent(QKeyEvent *event); 在Keys.onPressed里面需要做什么?我试过了
myclass.keyPressEvent(event)我在我的keyPressEvent.类中尝试了一个公共Q_INVOKABLE函数(handleKeyPress),其中包含参数(QKeyEvent * event),我想从该参数调用handleKeyPress
在运行时,前者给出
"TypeError:对象myclass的属性'keyPressEvent‘不是函数“
后者
“错误:未知方法参数类型: QKeyEvent*”。
(然后我发现qml只能处理指向QObject的指针,而QKeyEvent并不继承QObject,但这无助于我找到解决方案。)
那么,从qml调用keyPressEvent的正确方法是什么呢?或者,如果这完全是错误的方法,那么如果我的类需要QKeyEvent可以给我的信息,那么正确的方法是什么呢?
发布于 2018-07-24 08:06:25
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)https://stackoverflow.com/questions/51491711
复制相似问题