是否可以在 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()
我正在尝试使用 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()