如何从 qml Keys.onPressed 调用 qt keyPressEvent(QKeyEvent *event)
How to call qt keyPressEvent(QKeyEvent *event) from qml Keys.onPressed
我有一个 qml Window,其中一个项目有
Keys.onPressed {
}
我有一个 c++ class 有
protected:
void keyPressEvent(QKeyEvent *event);
Keys.onPressed里面需要放什么?我试过了
myclass.keyPressEvent(event)
并且我在我的 c++ class 中尝试了一个 public Q_INVOKABLE 函数 (handleKeyPress),参数 (QKeyEvent * event) 来自我想调用 keyPressEvent。
在运行时,前者给出
"TypeError: Property 'keyPressEvent' of object myclass is not a
function"
后者
"Error: Unknown method parameter type: QKeyEvent*".
(后来我发现qml只能处理指向QObject的指针,而QKeyEvent并没有继承自QObject,但这并不能帮助我找到解决方案。)
那么从qml中调用keyPressEvent的正确方法是什么?或者,如果这完全是错误的方法,如果我的 class 需要 QKeyEvent 可以给我的信息,比如按下了哪个键等,那么正确的方法是什么?
KeyEvent
不是一个QKeyEvent *
,而是一个class,继承了QObject
,封装了一个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)
但不推荐这样做。你的 class 不应该直接知道事件,但最好的是你处理 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)
我有一个 qml Window,其中一个项目有
Keys.onPressed {
}
我有一个 c++ class 有
protected:
void keyPressEvent(QKeyEvent *event);
Keys.onPressed里面需要放什么?我试过了
myclass.keyPressEvent(event)
并且我在我的 c++ class 中尝试了一个 public Q_INVOKABLE 函数 (handleKeyPress),参数 (QKeyEvent * event) 来自我想调用 keyPressEvent。
在运行时,前者给出
"TypeError: Property 'keyPressEvent' of object myclass is not a function"
后者
"Error: Unknown method parameter type: QKeyEvent*".
(后来我发现qml只能处理指向QObject的指针,而QKeyEvent并没有继承自QObject,但这并不能帮助我找到解决方案。)
那么从qml中调用keyPressEvent的正确方法是什么?或者,如果这完全是错误的方法,如果我的 class 需要 QKeyEvent 可以给我的信息,比如按下了哪个键等,那么正确的方法是什么?
KeyEvent
不是一个QKeyEvent *
,而是一个class,继承了QObject
,封装了一个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)
但不推荐这样做。你的 class 不应该直接知道事件,但最好的是你处理 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)