C++ 是否可以在Component.onCompleted完成之前初始化ApplicationWindow?
我正在尝试使用的修改版本从.csv文件导入一些数据。我应该使用这些数据来显示轴姿态信息。因此,值应该每秒自动更新一次。然后我为每个变量创建了Q_属性,并创建了从CSV文件获取数据的代码。在每次更改过程之后,我还添加了emit valueChanged()C++ 是否可以在Component.onCompleted完成之前初始化ApplicationWindow?,c++,qt,qml,C++,Qt,Qml,我正在尝试使用的修改版本从.csv文件导入一些数据。我应该使用这些数据来显示轴姿态信息。因此,值应该每秒自动更新一次。然后我为每个变量创建了Q_属性,并创建了从CSV文件获取数据的代码。在每次更改过程之后,我还添加了emit valueChanged() void FileIO::getData() { if (mSource.isEmpty()){ emit error("source is empty"); } QFile file
void FileIO::getData()
{
if (mSource.isEmpty()){
emit error("source is empty");
}
QFile file(mSource);
if (file.open(QIODevice::ReadOnly) ) {
QString line;
while (!file.atEnd()) {
QByteArray line = file.readLine();
xValue = line.split(',')[0].toFloat();
emit xValueChanged();
yValue = line.split(',')[3].toFloat();
emit yValueChanged();
zValue = line.split(',')[4].toFloat();
emit zValueChanged();
//Sleep(1000);
qDebug()<< xValue <<yValue << zValue;
}
file.close();
} else {
emit error("Unable to open the file");
}
}
问题是我必须使用这些数据来实时旋转3D对象,但是引擎在Component.onCompleted完成之前不会加载ApplicationWindow。我看到值正在更新-打印到屏幕上-但transformer组件无法使用它们,因为ApplicationWindow在组件完成之前未初始化。onCompleted完成,因此我只看到最后的值。问题是数据读取速度非常快,以至于我们缓慢的视力看不到变化。在这种情况下,您应该创建一个只读取一行并更新xValue、yValue和zValue的值的方法,然后使用计时器每隔T秒调用该方法:
class文件IO:公共QObject{
Q_对象
Q_属性(QString源读取源写入设置源通知源已更改)
Q_属性(qreal xValue READ xValue NOTIFY xValueChanged)
Q_属性(qreal yValue READ xValue NOTIFY yValueChanged)
Q_属性(qreal zValue READ xValue NOTIFY zValue changed)
公众:
FileIO(QObject*parent=nullptr):
QObject(父对象)、m_xValue(0.0)、m_yValue(0.0)、m_zValue(0.0)、m_start(false)
{
}
QString source()常量
{
返回m_file.fileName();
}
void setSource(QString源)
{
if(m_file.fileName()==源)
返回;
m_file.setFileName(源文件);
Q_EMIT sourceChanged();
}
qreal xValue()常量
{
返回mxu值;
}
qreal yValue()常量
{
返回m_y值;
}
qreal zValue()常量
{
返回m_zValue;
}
Q_可调用bool readNext(){
幽会();
QString线;
if(m_ts.readLineInto(&line)){
生产线;
返回true;
}
返回false;
}
Q_信号:
void sourceChanged();
void xValueChanged();
void yValueChanged();
void zValueChanged();
受保护的:
无效进程行(常量字符串和行){
QStringList字符串_值=line.split(“,”);
矢量值(3);
对于(int i=0;i qDebug()谢谢,代码看起来很好。我可以大致理解,但是更新过程的原因不清楚。我的意思是在cpp方面,已经很清楚了,但是应该有一个火花器开始在QML方面执行头文件的过程,不是吗?我还没有执行它,也许它可以工作,但我想理解。@HalilKaraba请看更新
FileIO{
id: dataCSV
source: "C:/Users/Halil/yedekleme/Belgeler/build-serialGui-Desktop_Qt_5_14_2_MinGW_32_bit-Release/data.csv"
}
Component.onCompleted: {
dataCSV.getData()
}
...
Entity
{
id: satEntity
components: [
SceneLoader
{
id: sceneLoader
source: "sat.stl"
},
Transform {
id:satTransform
rotationX: dataCSV.xValue
rotationY: dataCSV.yValue
rotationZ: dataCSV.zValue
}
]
}
FileIO{
id: dataCSV
source: "C:/Users/Halil/yedekleme/Belgeler/build-serialGui-Desktop_Qt_5_14_2_MinGW_32_bit-Release/data.csv"
}
Timer{
id: timer
interval: 1000
repeat: true
onTriggered: {
if(!dataCSV.readNext())
dataCSV.stop()
}
}
Component.onCompleted: timer.start()