C++与QML交互

需求C++QML

在QML工程中,一般QML界面只负责前端交互,而真正的业务逻辑都是C++模块实现的。为了实现前端和后端的顺利衔接,我们需要做好QML界面与C++的交互。 这里举例介绍一种C++逻辑处理结果给QML界面使用的方法。

需求

当前工业需求发展迅速,很多工业级生产都开始不仅仅局限于功能的实现,效率开始成为大家相互比较优缺的一种方式。 在QML项目中,QML一般仅负责界面的处理,并不会涉及逻辑方面,所以,很多时候,C++与QML的通讯问题成为刚入门QMLの朋友们一大难题。

这里我们使用C++处理加工开始与加工结束这一段时间的用时,然后刷新到QML界面进行关联并显示。

C++

//类 头文件

public slots:

void getCurrentStartTime(); //获取开始时间

void getCurrentEndTime(); //获取结束时间

QString setWorkTime(); //计算时间戳

public:

QDateTime nStartTime;

QDateTime nEndTime;

signals:

void refreshSignal(QString msg); //QML获取C++数据的信号函数,无需实现

//类 cpp文件

// 假设类为A

void A::getCurrentStartTime()

{

nStartTime = QDateTime::currentDateTime();

}

void A::getCurrentEndTime()

{

nEndTime = QDateTime::currentDateTime();

}

QString A::setWorkTime()

{

QTime m_time;

m_time.setHMS(0,0,0,0); //初始化数据 时、分、秒、毫秒

return m_time.addSecs(nStartTime.secsTo(nEndTime)).toString("hh:mm:ss"); //返回格式化数据

}

// C++ 实际调用

//开始加工:

A::ins().getCurrentEndTime(); //ins是注册在QML那边的一个东西,类似C++类对象

//结束加工:

A::ins().getCurrentEndTime();

//计算加工用时并传入QML

emit A::ins().refreshSignal(A::ins().setWorkTime());

QML

QML绑定、通过C++emit信号进行改变界面并刷新

KTextInput{

//需要刷新的控件

id: id_worktime_value

anchors.top: id_grid.bottom

anchors.topMargin: 5

x: 280

height: 25

width: 100

selectTextByMouse: true //是否可通过鼠标选中

clip: true

displayText: editText = workParamSettings.strTimeSpace

enabled: true

Component.onCompleted: {

//绑定

a.refreshSignal.connect(id_worktime_value.recvWorkTime)

}

//刷新时间

function recvWorkTime(str) {

id_worktime_value.editText = str

}

}

代码块中类似 workParamSettings.strTimeSpace 就是QML与C++注册的类似C++的类对象,QML全局可调用,如下:

QQmlApplicationEngine engine;

engine..addImportPath(app.applicationDirPath() + "/qml");

//下面的除开第一句,第二句第一个参数都是小写开头,C++绑定的参数也是,小写开头

qmlRegisterSingletonInstance("QLCut", 1, 0, "KDrawingView", &KDrawingView::ins());

engine.rootContext()->setContextProperty("workParamSettings", &KWorkParamSettings::ins());

上面的方法只是C++与QML 交互的一种方式,仅供技术学习交流…

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: