是否可以在 Component.onCompleted 完成之前初始化应用程序窗口?

Is it possible to initalize ApplicationWindow before Component.onCompleted is done?

我正在尝试使用 FileIO 的修改版本从 .csv 文件导入一些数据。我应该使用此数据来显示轴姿态信息。因此,值应该每秒自动更新一次。然后我为每个变量创建了 Q_PROPERTIES 并创建了从 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");
    }
}

到目前为止,一切都很好,但为了启动我使用的导入过程 Component.onCompleted。

    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
                    }
                ]
            }

问题是我必须使用这些数据实时旋转 3D 对象,但在 Component.onCompleted 完成之前引擎不会加载 ApplicationWindow。我看到值正在更新 - 将它们打印到屏幕上 - 但转换器组件无法使用它们,因为 ApplicationWindow 在 Component.onCompleted 完成之前未初始化,因此我只看到最后一个值。

问题是数据的读取速度非常快,我们慢的视觉看不到变化。在这种情况下,您应该做的是创建一个只读取一行并更新 xValue、yValue 和 zValue 的值的方法,然后使用 Timer 每 T 秒调用该方法:

class FileIO: public QObject{
    Q_OBJECT
    Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)
    Q_PROPERTY(qreal xValue READ xValue NOTIFY xValueChanged)
    Q_PROPERTY(qreal yValue READ xValue NOTIFY yValueChanged)
    Q_PROPERTY(qreal zValue READ xValue NOTIFY zValueChanged)
public:
    FileIO(QObject *parent=nullptr):
        QObject(parent), m_xValue(0.0), m_yValue(0.0), m_zValue(0.0), m_started(false)
    {
    }
    QString source() const
    {
        return m_file.fileName();
    }
    void setSource(QString source)
    {
        if (m_file.fileName() == source)
            return;
        m_file.setFileName(source);
        Q_EMIT sourceChanged();
    }
    qreal xValue() const
    {
        return m_xValue;
    }
    qreal yValue() const
    {
        return m_yValue;
    }
    qreal zValue() const
    {
        return m_zValue;
    }

    Q_INVOKABLE bool readNext(){
        tryStart();
        QString line;
        if(m_ts.readLineInto(&line)) {
            processLine(line);
            return true;
        }
        return false;
    }
Q_SIGNALS:
    void sourceChanged();

    void xValueChanged();
    void yValueChanged();
    void zValueChanged();
protected:
    void processLine(const QString & line){
        QStringList string_values = line.split(",");
        QVector<qreal> values(3);
        for(int i=0; i < values.size(); ++i){
            if(i < string_values.length()){
                values[i] = string_values[i].toDouble();
            }
        }
        m_xValue = values[0];
        m_yValue = values[1];
        m_zValue = values[2];
        Q_EMIT xValueChanged();
        Q_EMIT yValueChanged();
        Q_EMIT zValueChanged();
    }
private:
    bool tryStart(){
        if(m_started)
            return true;
        if(!m_file.open(QIODevice::ReadOnly)){
            qDebug() << m_file.errorString();
            m_ts.setDevice(nullptr);
            m_started = false;
            return false;
        }
        m_ts.setDevice(&m_file);
        m_started = true;
        return true;
    }
    QFile m_file;
    QTextStream m_ts;
    qreal m_xValue;
    qreal m_yValue;
    qreal m_zValue;
    bool m_started;
};
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()