qt creator 主窗口解析json文件,将读取到的数据写入结构体,传值到子窗口中,修改后的结构体再传回到主窗口
时间: 2024-02-16 11:04:23 浏览: 110
首先,你需要在主窗口中创建一个读取json文件的函数,使用QJsonDocument和QJsonObject来解析json文件,并将数据写入结构体中。这个函数可能类似于以下代码:
```C++
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
struct MyData {
QString name;
int age;
QString address;
};
void MainWindow::loadJsonFile(QString filename, MyData& data) {
QFile file(filename);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Failed to open file:" << filename;
return;
}
QByteArray jsonData = file.readAll();
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
QJsonObject jsonObj = jsonDoc.object();
data.name = jsonObj["name"].toString();
data.age = jsonObj["age"].toInt();
data.address = jsonObj["address"].toString();
}
```
接下来,你需要在主窗口中创建一个槽函数来打开子窗口,并将结构体传递给子窗口。这个函数可能类似于以下代码:
```C++
void MainWindow::openChildWindow() {
ChildWindow* childWindow = new ChildWindow(this);
childWindow->setData(m_data);
connect(childWindow, &ChildWindow::dataChanged, this, &MainWindow::onDataChanged);
childWindow->show();
}
```
在这里,我们假设你已经在主窗口中定义了一个结构体变量m_data来存储读取到的数据,openChildWindow()函数会创建一个子窗口并调用子窗口的setData()函数将m_data传递给它。
在子窗口中,你需要定义一个setData()函数来接收主窗口传递过来的结构体,并将它存储在一个成员变量中。这个函数可能类似于以下代码:
```C++
void ChildWindow::setData(const MyData& data) {
m_data = data;
ui->nameEdit->setText(data.name);
ui->ageSpinBox->setValue(data.age);
ui->addressEdit->setText(data.address);
}
```
在这里,我们假设你已经在子窗口中定义了一个MyData类型的成员变量m_data,setData()函数会将主窗口传递过来的结构体存储在这个成员变量中,并将结构体中的数据显示在对应的控件中。
当用户在子窗口中修改了数据后,你需要在子窗口中定义一个槽函数来将修改后的结构体传递给主窗口。这个函数可能类似于以下代码:
```C++
void ChildWindow::on_okButton_clicked() {
m_data.name = ui->nameEdit->text();
m_data.age = ui->ageSpinBox->value();
m_data.address = ui->addressEdit->text();
emit dataChanged(m_data);
close();
}
```
在这里,我们假设你在子窗口中定义了一个名为dataChanged的信号,用于将修改后的结构体传递给主窗口。当用户点击子窗口中的确认按钮时,on_okButton_clicked()函数会将修改后的结构体存储在m_data中,并通过dataChanged信号将它传递给主窗口。
最后,在主窗口中,你需要定义一个槽函数来接收子窗口传递过来的修改后的结构体,并更新主窗口中的数据。这个函数可能类似于以下代码:
```C++
void MainWindow::onDataChanged(const MyData& data) {
m_data = data;
ui->nameLabel->setText(data.name);
ui->ageLabel->setText(QString::number(data.age));
ui->addressLabel->setText(data.address);
}
```
在这里,我们假设你已经在主窗口中定义了一个MyData类型的变量m_data,onDataChanged()函数会将子窗口传递过来的修改后的结构体存储在这个变量中,并将结构体中的数据显示在对应的标签控件中。
综上所述,你可以通过以上步骤在Qt Creator中实现解析json文件,将数据写入结构体,传递到子窗口中,修改后再传回到主窗口中的功能。
阅读全文