Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 关闭应用程序后保存qlistwidget_Qt_Profile_Notepad_Qlistwidget - Fatal编程技术网

Qt 关闭应用程序后保存qlistwidget

Qt 关闭应用程序后保存qlistwidget,qt,profile,notepad,qlistwidget,Qt,Profile,Notepad,Qlistwidget,我有一个程序,允许用户创建一个配置文件,使用qsettings保存值,用户通过点击qlistwidget中的名称访问他们的配置文件。我试图通过使用文本文件保存配置文件的名称,但一次保存多个配置文件名称时遇到问题。非常感谢。代码如下: 用于将profilename保存到文本文档 void Profile::writeProfilenames() { QString profilename = ui->lineEdit_profilename->text(); profi

我有一个程序,允许用户创建一个配置文件,使用qsettings保存值,用户通过点击qlistwidget中的名称访问他们的配置文件。我试图通过使用文本文件保存配置文件的名称,但一次保存多个配置文件名称时遇到问题。非常感谢。代码如下:

用于将profilename保存到文本文档

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();

}

另外,如果你知道一个更好的方法,那么请随意分享!(请举个例子)

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

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

  • 您可能不想将名称“写入”文件,在开始时覆盖现有内容,而是特别想附加到文件中。您还必须指定文件的可写路径,到目前为止,您使用的是当前工作目录:变量,不在您的控制之下,不一定是可写的。您的代码也不会处理重复的名称

  • <> >代码> qFrase/Cord>是一个合适的C++类,体现了原则。你不必做任何事情来刷新和关闭文件。编译器负责为您生成正确的代码。这就是为什么你使用C++而不是C的原因。是的,您的代码可以编译,但是它读起来像C,这样的冗长是不必要的,而且会适得其反

  • 您只能从文件中检索一个名称。您希望检索所有这些文件

  • 我认为您应该放弃文件访问,设置应用程序的标识,这是使用
    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();
    }
    
    struct配置文件{
    QString名称;
    智力年龄;
    }
    void saveProfiles(const QList和profiles)
    {
    QSettings;
    s、 beginWriteArray(“简介”);
    对于(int i=0;iprofiles经过更多的研究和反复试验,我想出了以下代码来实现这一点:
    当我关闭“配置文件”对话框窗口并使用
    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();
    
    }
    

    我现在正在努力确保用户不输入已经存在的profilename,并从QListWidget中删除profilename。

    我在另一个论坛/窗口中实现qsettings,profilename只是“关键字”这将传递给另一个论坛,告诉您要使用什么设置。此代码仍然有效吗?此外,我遇到了以下我难以解决的错误:在
    saveProfilenames
    中,编译器说在“&”标记之前有一个预期的初始值设定项,并且
    p
    未在此范围内声明。如果如果我正确理解了代码,这将创建一个profilename的QList,然后我可以将它添加到listwidget?感谢您的帮助help@fluxD613它是一个引用,是固定的。用户创建的配置文件的实际名称在哪里?例如ui->lineedit->text()@fluxD613由您决定。您可以将它们放入
    Profile.name
    ,或
    Profile.profileName
    或其他任何内容。我不知道您想做什么,您必须弄清楚。
     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();
    
    }
    
    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();
    
    }