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 交互的一种方式,仅供技术学习交流…

猜你喜欢

转载自blog.csdn.net/m0_43458204/article/details/128288475