【问题标题】:Qt select existing fileQt选择现有文件
【发布时间】:2015-08-20 01:01:16
【问题描述】:

我是 Qt 新手,我希望能够选择一个名为 default.ini 的现有文件,该文件与 exe 位于同一目录中。我已经有一些代码允许我这样做,但用户每次都必须手动选择文件。

 QString file = QFileDialog::getOpenFileName(this, tr("Open File"), "/debug", tr("default (*.ini)"));

  if (file != NULL) {
    try {
      controller_->ConfigurationFileSave(file.toStdString());
        } catch (std::exception &e) {
      Logger::Log(std::string("Failed to save configuration: ") + e.what(), 
      Logger::kError);
    }
  }  

程序在写入/读取文件方面做了我想做的一切,我只是不希望程序在打开文件时需要任何用户输入。我知道我有用户输入的原因是因为我正在使用 QFileDialog 类,我只想知道是否有另一个类可以自动执行它。谢谢

编辑 1 根据 Arun 的建议,我尝试使用 Qfile。该程序现在成功地从 default.ini 配置文件中读取,但它不会保存到配置文件中。有没有一种简单的方法可以写入文件?

 QFile file("default.ini");
 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
 return;

 QString content = file.readAll();

 file.close();

 if (content != NULL) {
   try {
  controller_->ConfigurationFileSave(content.toStdString());
  } catch (std::exception &e) {
  Logger::Log(std::string("Failed to save configuration: ") + e.what(), 
      Logger::kError);
    }
  }

编辑 2 根据 Arun 的第二个建议:

QFile file("default.ini");
file.open(QIODevice::ReadOnly | QIODevice::Text); 
QString line = file.readAll();
file.close();

file.open(QIODevice::WriteOnly | QIODevice::Text);
try {
  controller_->ConfigurationFileSave(line.toStdString());
} catch (std::exception &e) {
  Logger::Log(std::string("Failed to save configuration: ") + e.what(), 
      Logger::kError);
}
file.close();

【问题讨论】:

  • 如果您知道目录名,那么您可以指定文件的完整路径。
  • 这不会仍然导致“打开文件”对话框出现吗?
  • 当你说“不会保存到配置文件”时,到底发生了什么?你一定在content有一些内容
  • 当我使用QFileDialog类时,我在“打开文件”对话框中选择了default.ini文件,我可以读写该文件。现在,当我使用 QFile 方法时,GUI 可以识别我在 ini 文件中手动编辑的变量,但我无法像以前那样写入文件。
  • 所有这些代码都在一个名为“应用”的按钮的按钮处理程序中。因此,当我编辑一些变量并单击应用时,当我使用 QFileDialog 方法时,这些变量用于保存到 ini 文件,但现在它们不保存

标签: c++ qt file-io


【解决方案1】:

您的文件选择器代码将文件名传递给ConfigurationFileSave()。这是无需交互即可获取该文件名的代码:

QDir appDir(QCoreApplication::applicationDirPath());
QFileInfo file(appDir, "default.ini");

// file.filePath() or file.absoluteFilePath() here:
controller_->ConfigurationFileSave( ___HERE___ );

您可以在 QtCreator 中通过创建一个新的控制台应用程序并将其用作您的 main.c 来测试它:

#include <QCoreApplication>
#include <QDebug>
#include <QFileInfo>
#include <QDir>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QDir appDir(QCoreApplication::applicationDirPath());
    QFileInfo file(appDir, "default.ini");

    qDebug() << "        " << file.filePath();
    qDebug() << "        " << file.absoluteFilePath();

    return 0;
}

输出:

silver:qt_app_dir hchapman$ ls
Makefile            main.cpp            main.o              qt_app_dir          qt_app_dir.pro      qt_app_dir.pro.user
silver:qt_app_dir hchapman$ ./qt_app_dir
     "/Users/hchapman/Desktop/qt_app_dir/default.ini"
     "/Users/hchapman/Desktop/qt_app_dir/default.ini"
silver:qt_app_dir hchapman$ cd ..
silver:Desktop hchapman$ ./qt_app_dir/qt_app_dir
     "/Users/hchapman/Desktop/qt_app_dir/default.ini"
     "/Users/hchapman/Desktop/qt_app_dir/default.ini"
silver:Desktop hchapman$

【讨论】:

  • 感谢您的回答,抱歉我是新手,但__HERE__ 位是什么意思?
  • 没什么。 :) 我只是告诉你应该在哪里使用file.filePath()
  • 另外,由于文件是一个 QFileInfo 对象,你可以测试你的文件是否存在(如果重要的话)。
  • 感谢您的帮助,您是正确的!发布他的答案然后删除它的人有一个更简单的答案,但我更了解你的答案。我所要做的就是controller_-&gt;ConfigurationFileSave("default.ini");
  • 您应该使用 appdir 代码。如果您的应用程序曾经从另一个目录运行,那么它仍然会正确找到 ini 位置。
【解决方案2】:

这是一个典型的例子,说明如何在不使用 QFileDialog 的情况下进行文件 I/O。 这个例子这里使用QFile

QFile file("default.ini");
if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
    return;

while (!file.atEnd()) {
    QByteArray line = file.readLine();
    process_line(line);
}

【讨论】:

  • 感谢您的回答。我尝试使用您的代码,但 ConfigurationFileSave 方法需要一个字符串。我对我的问题添加了编辑
猜你喜欢
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多