【问题标题】:Error when try to read from a QFile尝试从 QFile 读取时出错
【发布时间】:2018-07-15 09:13:58
【问题描述】:

我想用 QT 从文件中读取一些数据,然后通过 QComboBox 在 QTableWidget 中显示数据。

void DemoDataView::on_comboBox_activated(const QString &arg1)
{
    ui->tableWidget->setColumnCount(5);
    ui->tableWidget->setRowCount(21);
    ui->tableWidget->verticalHeader()->setVisible(false);
    ui->tableWidget->setHorizontalHeaderLabels(QString("Age Range ; Male Population ; Male Percentage ; Female Population ; Female Percentage").split(";"));
    ui->tableWidget->resizeColumnsToContents();
    ui->tableWidget->resizeRowsToContents();

QFile inputFile("./data.txt");

if(!inputFile.open(QIODevice::ReadOnly))
{
    QMessageBox::information(0, "Error", inputFile.errorString());
}

QTextStream in(&inputFile);
int rows = 0;

while(!in.atEnd()) {

    QString mLine = in.readLine();
    QStringList fields = mLine.split(" ");
    QStringList::iterator it = fields.begin();
    QString regName = *it;

    ui->label->setText(arg1);

    if(regName != "<END>" && QString::compare(regName, arg1) == 0) {
        ui->label->setText(regName);
        it++;
        QString ageRange = *it;
        it++;
        QString nMale = *it;
        double male = nMale.toDouble();
        it++;
        QString nFemale = *it;
        double female = nFemale.toDouble();
        ui->tableWidget->setItem(rows, 0, new QTableWidgetItem(ageRange));
        ui->tableWidget->setItem(rows, 1, new QTableWidgetItem(nMale));
        ui->tableWidget->setItem(rows, 3, new QTableWidgetItem(nFemale));
        ui->tableWidget->setItem(rows, 2, new QTableWidgetItem(malePercCalc(male, female)));
        ui->tableWidget->setItem(rows, 4, new QTableWidgetItem(femalePercCalc(male, female)));

        rows++;

    }

inputFile.close();

    }
}

该文件位于项目文件夹和构建项目文件夹中。 当我运行应用程序时,一切正常,但在“应用程序输出”选项卡中出现以下错误消息:

"QIODevice:: read (QFile, "./data.txt"): 设备未打开"

每次我点击一个 QComboBox 项。

如果有用的话,这是QComboBox的填充代码:

void DemoDataView::setComboBoxRegion() {

QFile inputFile("./data.txt");

if(!inputFile.open(QIODevice::ReadOnly))
{
    QMessageBox::information(0, "Error", inputFile.errorString());
}

QTextStream in(&inputFile);

while(!in.atEnd()) {

    QString mLine = in.readLine();
    QStringList fields = mLine.split(" ");


    QStringList::iterator it = fields.begin();
    QString regName = *it;

    if(regName != "<END>") {
        if(ui->comboBox->findText(regName) == -1){
            ui->comboBox->addItem(regName);
        }
    }
}

inputFile.close();
}

【问题讨论】:

  • "./data.txt" 这个路径对吗?你在哪里有data.txt?
  • 我建议使用像QApplication::applicationDirPath() + "/data.txt这样的完整路径
  • 正如我在上面的帖子中所说,文件保存在项目文件夹和构建项目文件夹中。我认为这是正确的,因为我可以在我尝试使用 ' QApplication::applicationDirPath() + "/data.txt" ' 的 QTableWidget 中看到数据,但我有同样的问题
  • 愚蠢的想法 - 也许您正试图从代码中其他地方的同一个文件中读取,而您忘记在那里打开文件?因为这段代码看起来不错,如果文件未打开,您将收到一条错误消息
  • 也许问题是你在while循环中调用inputFile.close();,在这个循环中你使用in.readLine();读取数据。

标签: c++ qt qt-creator


【解决方案1】:

你的问题是你在打电话:

inputFile.close();

在您的循环内部,这意味着它在第一个循环中关闭。我真的想不出有什么情况会发生这种情况;

要解决这个问题,您应该将它移到循环的外部

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 2021-03-15
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多