Qt - 如何将 QVector<QString> 保存并加载到多个标签中?

Posted

技术标签:

【中文标题】Qt - 如何将 QVector<QString> 保存并加载到多个标签中?【英文标题】:Qt - How to save and load a QVector<QString> into multiple labels? 【发布时间】:2016-02-20 23:34:37 【问题描述】:

所以我有多个充满文本的标签,我想将所有这些标签一次性保存到 QVector&lt;QString&gt; 中。下面的代码是我尝试过的,它可以工作,但是当我加载保存的文件时没有加载任何内容,我已经用记事本检查了保存的文件并且里面有东西,所以加载选项可能无法正常工作?我不确定,但感谢您的帮助。如果这看起来很糟糕或效率极低,我还问您是否可以提出更好的方法,再次感谢您的提前帮助。

保存代码:

void Tasks::on_pushButton_5_clicked()

const int length = 10;
QVector<QString> AllTasks(length);
AllTasks<<ui->label->text()<<ui->label_2->text()<<ui->label_3->text()<<ui->label_4->text()<<
          ui->label_5->text()<<ui->label_6->text()<<ui->label_10->text()<<ui->label_11->text()<<
          ui->label_12->text()<<ui->label_13->text();
QString fileName = QFileDialog::getSaveFileName(this,tr("Save All Tasks"),"", tr("Tasks(*.tsk);;All Files (*)"));
QFile file(fileName);
if(file.open(QIODevice::WriteOnly))
    QDataStream stream(&file);
    stream<<AllTasks;

file.close();

以及加载代码:

void Tasks::on_pushButton_6_clicked()

const int length = 10;
QVector<QString> AllTasks(length);
AllTasks<<ui->label->text()<<ui->label_2->text()<<ui->label_3->text()<<ui->label_4->text()<<
          ui->label_5->text()<<ui->label_6->text()<<ui->label_10->text()<<ui->label_11->text()<<
          ui->label_12->text()<<ui->label_13->text();
QString fileName = QFileDialog::getOpenFileName(this,tr("Save Tasks"),"", tr("Task(*.tsk);;All Files (*)"));
QFile file(fileName);
if(file.open(QIODevice::ReadOnly))
    QDataStream stream(&file);
    stream.setVersion(QDataStream::Qt_4_8);
    stream>>AllTasks;
    
    file.close();

【问题讨论】:

【参考方案1】:

你这样做是为了节省:

AllTasks<<ui->label->text()<<ui->label_2->text()<<ui->label_3->text()<<ui->label_4->text()<<
      ui->label_5->text()<<ui->label_6->text()<<ui->label_10->text()<<ui->label_11->text()<<
      ui->label_12->text()<<ui->label_13->text();

并且您对加载执行相同的操作。为什么? “数据流”在操作员的方向(&lt;&lt; - 进入AllTasks)。此代码不会创建引用标签文本对象的特殊元素。

它的作用与将数据保存到文件中的作用完全一样。它填满了AllTasks。然后,你用从文件中读取的数据来填充它。

解决方案:&lt;&lt; 更改为&gt;&gt; 并移动整个语句以执行您完成读取文件之后。

编辑:没有operator&gt;&gt;。要么做:

ui->label->setText(AllTasks.at(0));
ui->label_2->setText(AllTasks.at(1));
...
ui->label_13->setText(AllTasks.at(12));

或:

QVector<QLabel*> labels << ui->label << ui->label_2 << ... << ui->label_13;

for(int i = 0; i < labels.size() && i < AllTasks.size(); ++i)
    labels[i]->setText(AllTasks[i]);

【讨论】:

我得到一个错误,它说:'operator>>' 不匹配(操作数类型是 QVector 和 QString) 哦,那你需要手动索引。确实没有这样的运算符。 你能解释一下怎么做吗?在 qt 方面我不是最好的。 ui-&gt;label-&gt;setText(AllTasks.at(0)); 等。我希望你能弄清楚其余的......如果你可以将这些标签组织在一个容器中可能会更好。 谢谢,但是当我现在加载它时,标签只是空白,知道为什么吗?

以上是关于Qt - 如何将 QVector<QString> 保存并加载到多个标签中?的主要内容,如果未能解决你的问题,请参考以下文章

多维数组的Qt QVector

qt中QVector<QTextBlock>如何转入QDataStream?

初始化并访问 <QVector< QVector<int> > QT5

Qt 如何从 QVector 中的数据创建位图并将其显示在小部件上?

Qt 读取文件并映射到 QVector 非常慢(崩溃)

Qt 将数据转换为 QPixmap