我有一个程序允许用户创建一个使用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。如果您知道更好的方法,那么随时分享! (请举例说明)
答案 0 :(得分:1)
我不太明白为什么要在文本文件中保存名称列表,而设置本身则使用QSettings
以特定于平台的方式保存。
您展示的代码有几个问题:
据推测,您不希望将名称“写”到文件中,在开头覆盖现有内容,而是专门追加到文件中。您还必须指定文件的可写路径,到目前为止,您使用的是当前工作目录:variable,不在您的控制之下,并且不一定是可写的。您的代码也不处理重复的名称。
QFile
是一个合适的C ++类,体现了RAII原则。您不必执行任何来刷新和关闭文件。编译器负责为您生成适当的代码。毕竟,这就是你使用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();
}
答案 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中删除配置文件名。