前言
接着上一节的,我们补充一下时间和日期的数据传递。
我将直接在上一节的工程添加代码,先附上链接:
QML学习笔记(五十一)QML与C++交互:数据转换------基本数据类型
一、代码测试
多余重复的部分就不说了,我们只说有变化的:
cpp
class CppClass : public QObject
{
Q_OBJECT
public:
explicit CppClass(QObject *parent = nullptr);
signals:
// 时间和日期
void sendDateTime(QDateTime datetimeparam);
void sendTime( QTime timeparam);
public slots:
void cppSlot();
// 时间和日期
void timeSlot(QTime time);
void dateTimeSlot(QDateTime datetime);
};
cpp
void CppClass::cppSlot()
{
qDebug()<<"cppSlot called";
emit sendDateTime(QDateTime::currentDateTime());
emit sendTime(QTime::currentTime());
}
void CppClass::timeSlot(QTime time)
{
qDebug()<< "Time from QML is :" << time;
}
void CppClass::dateTimeSlot(QDateTime datetime)
{
qDebug() << "DateTime from QML is :" << datetime;
}
cpp
import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 2.12
import com.mycompany 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("QmlBasicDataTypes")
property string mValue:"Clicked %1 times, double is %2"
property int clickCount:0
CppClass{
id: cppClassId
// 日期和时间
onSendDateTime:(datetimeparam) =>{
console.log("Received datetime :"+ datetimeparam);
//Extract info
console.log("Year :" + datetimeparam.getFullYear())
console.log("...",datetimeparam.toGMTString())
}
onSendTime: (timeparam)=>{
console.log("Received time :"+ timeparam);
}
}
Button{
id: buttonId
text: "test"
onClicked: {
cppClassId.cppSlot()
var date = new Date()
cppClassId.timeSlot (date);
cppClassId.dateTimeSlot(date)
//String fromatting
clickCount++
buttonId.text = mValue.arg(clickCount).arg(clickCount*2)
}
}
}
可以看到,在C++端,日期类是QDatetime,时间类是QTime,而qml中是Date,它会有getFullYear和toGMTString等方法获得年份和GMT格式日期。
看下打印结果:

这里最后一行接受的时间似乎有年份月份星期的错误,原因是我们传递的是QTime,这只包含时分秒时间,不包含日期,但qml端打印的时候是按照完整日期来打印的。
二、字符串替换参数
这里介绍一个替换字符串参数的方法:
cpp
property string mValue:"Clicked %1 times, double is %2"
property int clickCount:0
cpp
Button{
id: buttonId
text: "test"
onClicked: {
//String fromatting
clickCount++
buttonId.text = mValue.arg(clickCount).arg(clickCount*2)
}
}
功能是每次点击递增clickCount,然后按钮文本进行相应的修改。
这种做法和QString.arg().arg()是类似的。

三、总结
本节学习了时间日期的数据传递,这也是一个比较常用的变量。