关闭应用程序后保存qlistwidget

时间:2014-07-28 23:08:49

标签: qt profile notepad qlistwidget

我有一个程序允许用户创建一个使用qsettings保存值的配置文件,用户通过点击qlistwidget中的名称来访问他们的配置文件。我试图通过使用文本文件保存配置文件的名称,但我一次无法保存多个配置文件名称。谢谢!这是代码:

用于将配置文件名保存到文本文档

void Profile::writeProfilenames()
{
    QString profilename = ui->lineEdit_profilename->text();
    profilename = profilename.simplified();
    QFile pfile("profilenames.txt");
    if (!pfile.open(QFile::WriteOnly | QIODevice::Text))
    {
        return;
    }

    QTextStream out(&pfile);
    out << profilename;
    pfile.flush();
    pfile.close();

}

用于从文档中检索配置文件名称

void Profile::readProfilenames()
{
    QFile pfile("profilenames.txt");
    if (!pfile.open(QIODevice::ReadOnly |
                       QIODevice::Text))
   {
        return;
   }

    QString proname = pfile.readLine();
    QListWidgetItem *itm = new QListWidgetItem;
    itm->setText(proname);
    ui->listWidget_profiles->insertItem(0,itm);
}

P.S。如果您知道更好的方法,那么随时分享! (请举例说明)

2 个答案:

答案 0 :(得分:1)

我不太明白为什么要在文本文件中保存名称列表,而设置本身则使用QSettings以特定于平台的方式保存。

您展示的代码有几个问题:

  1. 据推测,您不希望将名称“写”到文件中,在开头覆盖现有内容,而是专门追加到文件中。您还必须指定文件的可写路径,到目前为止,您使用的是当前工作目录:variable,不在您的控制之下,并且不一定是可写的。您的代码也不处理重复的名称。

  2. QFile是一个合适的C ++类,体现了RAII原则。您不必执行任何来刷新和关闭文件。编译器负责为您生成适当的代码。毕竟,这就是你使用C ++而不是C的原因。是的,你的代码编译,但它的内容类似于C,这种冗长是不必要的,适得其反。

  3. 您只是从文件中检索一个名称。你想要检索所有这些。

  4. 我要说你应该省去文件访问权限,设置应用程序的标识,这是使用QSettings的关键先决条件,最后使用它们:

    struct Profile {
      QString name;
      int age;
    }
    
    void saveProfiles(const QList<Profile> & profiles)
    {
      QSettings s;
      s.beginWriteArray("profiles");
      for (int i = 0; i < profiles.size(); ++i) {
        s.setArrayIndex(i);
        const Profile & p = profiles.at(i);
        s.setValue("name", p.name);
        s.setValue("age", p.age);
      }
      s.endArray(); //optional
    }
    
    QList<Profile> loadProfiles()
    {
      QList<Profile> profiles;
      QSettings s;
      int size = s.beginReadArray("profiles");
      for (int i = 0; i < size; ++i) {
        s.setArrayIndex(i);
        Profile p;
        p.name = s.value("name").toString();
        p.age = s.value("age").toInt();
        profiles << p;
      }
      s.endArray(); // optional
      return profiles;
    }
    
    int main(int argc, char ** argv) {
      QApplication app(argc, argv);
      app.setOrganizationName("fluxD613"); // ideally use setOrganizationDomain instead
      app.setApplicationName("fluxer");
      ...
      return app.exec();
    }
    

答案 1 :(得分:0)

经过更多的研究和反复试验后,我想出了以下代码: 当我关闭配置文件对话框窗口并使用QCloseEvent返回主窗口时实现此功能。

 void Profile::writeProfilenames()
{
QFile pfile("profilenames.txt");
if (!pfile.open(QFile::WriteOnly | QIODevice::Text))
{
    return;
}

for(int row = 0; row < ui->listWidget_profiles->count(); row++)
{
    QListWidgetItem *item = ui->listWidget_profiles->item(row);
    QTextStream out(&pfile);
    out << item->text().simplified() << "\n";
}

pfile.close();

}

当我在ui->setup(this)下面打开对话框窗口时,会实现读取配置文件名列表。

void Profile::readProfilenames()
{

QFile pfile("profilenames.txt");
if (!pfile.open(QIODevice::ReadOnly |
                       QIODevice::Text))
   {
    return;
   }
QTextStream in(&pfile);
while (!in.atEnd())
{
    QString line = in.readLine();
    QListWidgetItem *item = new QListWidgetItem;
    item->setText(line);
    ui->listWidget_profiles->addItem(item);
}

pfile.close();

}

我现在正在努力确保用户不输入已存在的配置文件名并从QListWidget中删除配置文件名。