C++ 是否可以在Component.onCompleted完成之前初始化ApplicationWindow?

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

我正在尝试使用的修改版本从.csv文件导入一些数据。我应该使用这些数据来显示轴姿态信息。因此,值应该每秒自动更新一次。然后我为每个变量创建了Q_属性,并创建了从CSV文件获取数据的代码。在每次更改过程之后,我还添加了emit valueChanged()

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;iqDebug()谢谢,代码看起来很好。我可以大致理解,但是更新过程的原因不清楚。我的意思是在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()