QML 计时器未触发
QML timer not triggered
我在qml(StackView中的视图(中有一个计时器,我尝试从C++代码开始,调用javascript函数。但是我的计时器从未被触发。我做错了什么?我的流是 a.qml -> b.qml(单击按钮时(
文件 b.qml :
Item {
function connectionConfirmed() {
myTimer.start()
console.log("started timer")
}
Timer {
interval: 1000; running: false; repeat: false
id: myTimer
onTriggered: {
console.log("timer triggered")
}
}
}
文件 main.qml:
ApplicationWindow {
id: root
visible: true
width: 320
height: 530
StackView {
id: stackView
initialItem: "qrc:/a.qml"
anchors.fill: parent
}
}
文件 A.qml
MouseArea{
anchors.fill: parent
onClicked: {
stackView.push("qrc:/b.qml")
}
}
C++部分:
connect(&myObjectInstance, &X::somethingHappend, this, [this](){
QQmlComponent component(&engine_, "qrc:/b.qml");
QObject *obj = component.create();
QVariant returnedValue;
QMetaObject::invokeMethod(obj, "connectionConfirmed",
Q_RETURN_ARG(QVariant, returnedValue));
delete obj;
});
输出为:started timer
当我尝试设置触发running: true
计时器时,是否意味着我无法从JS函数启动计时器?
之所以出现此问题,是因为您假设在C++端创建的组件与在 QML 端创建的组件相同。.qml文件是源代码,当你调用它时,它们每次都会生成一个不同的对象。
行为说明:
connect(&myObjectInstance, &X::somethingHappend, this, [this](){
QQmlComponent component(&engine_, "qrc:/b.qml");
QObject *obj = component.create();
QVariant returnedValue;
QMetaObject::invokeMethod(obj, "connectionConfirmed",
Q_RETURN_ARG(QVariant, returnedValue));
delete obj;
});
在此代码中,您首先创建组件,然后创建对象,调用用js编写的函数,该函数刚刚执行并打印消息,然后删除它,因此当您删除它时,它将永远不会触发。 新计时器,因此,打印第一条消息的似乎是在 QML 中创建的项目, 但事实并非如此,新项目打印了它。
调用 C++ QML 函数会带来这些问题,因为很多时候您无法访问所需的对象。
相反,Qt指示的建议是在QML端建立连接,为此您必须使用setContextProperty()
导出C++对象
。在下面的示例中,使用其 QML 实现,我们创建了一个具有称为 mysignal 的信号的类,它每 5 秒触发一次以进行测试。该类的对象被导出到 QML 并连接,以便它从 QML 调用 js 函数
主.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QTimer>
class Helper: public QObject{
Q_OBJECT
public:
using QObject::QObject;
signals:
void mysignal();
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
Helper helper;
engine.rootContext()->setContextProperty("helper", &helper);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [&helper](){
emit helper.mysignal();
});
timer.start(5000);
return app.exec();
}
#include "main.moc"
B.QML
import QtQuick 2.0
Item {
id: it
function connectionConfirmed() {
myTimer.start()
console.log("started timer")
}
Timer {
interval: 1000; running: false; repeat: false
id: myTimer
onTriggered: {
console.log("timer triggered")
}
}
Connections{
target: helper
onMysignal: it.connectionConfirmed()
}
}
最后,在 StackView 中,每次更改页面时都会创建和销毁项目。
相关文章:
- Linux的Cpp上的计时器
- 提升 ASIO 无法识别计时器对象
- 提升 asio 并发计时器取消问题与链
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 窗口中的微秒计时器
- 计时器是否从另一个线程启动?
- 如何在 c++ 中创建计时器
- C++回调计时器实现
- 在计时器或主线程外部的命令上销毁/替换线程
- 如何制作每秒从 30 乘 1 倒计时的计时器?
- 保留计时器集合(对象与指针)的最佳方法
- 在网络套接字计时器滴答后增加asio短读错误
- 是否可以仅使用标准 c++/c++11 实现不带"sleep"的计时器?
- 在没有NtSetTimerResolution的Windows上提高计时器分辨率(高分辨率)
- 计时器坏了或者其他什么的
- 功能计时器阻止主功能继续
- IO服务重新启动后,Boost最后期限计时器持续触发
- QML 计时器未触发
- 从高度动态的C 数据模型中更新QML:计时器与属性绑定
- QML 计时器 - 如何提高准确性