c++ - 如何从 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 可以给我的信息,比如按下了哪个键等,那么正确的方法是什么?
解决方案
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)
推荐阅读
- typescript - ref.getMetadata does not subscribe in AngularFireStorage
- flutter - 如何使用 SharedPreferences-Flutter/Dart 从 json 获取内容
- javascript - Javascript Snake 实现
- r - 是否有用于对数据帧的每一列执行基本操作的 R 函数?
- java - 为什么使用 Apache Camel rest DSL 而不是 spring boot rest 控制器?
- java - 获取调用当前对象的对象
- javascript - 当我只告诉它调用一个函数时,Blazor Server 应用程序中的 JSRuntime.InvokeVoidAsync 调用了多个函数
- css - Use of CSS property 'position' in ::after pseudoelement
- python - Python Flask“无效凭据”
- docker - 在将 jenkins 与 GKE 集成时,在部署阶段运行 jenkins 管道时出错