【问题标题】:I can't save .txt file with QFileDialog, C++ QT我无法使用 QFileDialog、C++ QT 保存 .txt 文件
【发布时间】:2016-02-25 15:36:26
【问题描述】:

这是我的代码:

void MainWindow::save(){
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save Text File"), path, tr("Text Files (*.txt)"));
    if (fileName != "")
    {
       QFileInfo info(fileName);
       path = info.absoluteDir().absolutePath();
       QFile file(path);
       if(!file.open(QIODevice::WriteOnly)){
           QString text = ui->plainTextEdit->toPlainText();
           QTextStream out(&file);
           out << text ;
           file.close();
       }
    }
}

但点击按钮后它不会创建任何 .txt 文件:

connect(ui->saveButton, SIGNAL(clicked(bool)), this, SLOT(save()));

日志:

QIODevice::write (QFile, "C:\Users\kfg\Desktop"): device not open

感谢您的帮助:)

【问题讨论】:

  • if(!file.open(QIODevice::WriteOnly)){ 确定要在open 失败时写入文件吗?
  • 转到 `C:\Users` 并检查您当前的用户帐户和管理员组是否具有对 kfg 的配置文件文件夹的完全访问权限。见文章:answers.microsoft.com/en-us/windows/forum/windows_7-files/…
  • 比@SimonKraemer 的评论更明确(这样我就可以投票关闭它作为一个无法再复制的错字):您的错误检查被颠倒了。正如所写的那样,您仅在打开失败时才尝试写入,如果打开成功则不要尝试写入。
  • @VladimirBershov 他没有必要这样做。仔细阅读他的代码,注意他的错误检查反转。

标签: c++ qt qfile qfiledialog qtextstream


【解决方案1】:

你犯了两个错误。

第一个在path = info.absoluteDir().absolutePath(); 行中 这将为您提供目录的路径,而不是文件。你应该使用path = info.absoluteFilePath();。见QFileInfo::absoluteFilePath()

接下来是当open 返回false(失败)时写入“文件”。

我认为要使您的代码正确,您应该使用以下内容:

void MainWindow::save() 
{
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save Text File"), path, tr("Text Files (*.txt)"));
    if (fileName != "")
    {
        QFile file(QFileInfo(fileName).absoluteFilePath());
        if (file.open(QIODevice::WriteOnly))
        {
            QString text = ui->plainTextEdit->toPlainText();
            QTextStream out(&file);
            out << text;
            file.close();
        }
        else
        {
            //TODO: Error message
        }
    }
}

您可能还想检查文件是否已经存在并询问用户是否可以覆盖它...

void MainWindow::save() 
{
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save Text File"), path, tr("Text Files (*.txt)"));
    if (fileName != "")
    {
        QFile file(QFileInfo(fileName).absoluteFilePath());

        if (file.exists())
        {
            QMessageBox::StandardButton chosenButton 
                = QMessageBox::warning(this, tr("File exists"), tr("The file already exists. Do you want to overwrite it?"), 
                    QMessageBox::Ok | QMessageBox::Cancel, 
                    QMessageBox::Cancel);
            if (chosenButton != QMessageBox::Ok)
            {
                return; //Save was cancelled
            }
        }
        if (!file.open(QIODevice::WriteOnly))
        {
            QMessageBox::critical(this, tr("Error"), tr("Failed to save file"));
            return; //Aborted
        }
        //All ok - save data
        QString text = ui->plainTextEdit->toPlainText();
        QTextStream out(&file);
        out << text;
        file.close();
    }
}

你还应该检查写入文件是否真的成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2020-10-08
    相关资源
    最近更新 更多