C++ 删除所有字符串后,如何恢复QStringList?

C++ 删除所有字符串后,如何恢复QStringList?,c++,qt,C++,Qt,我创建了一个按钮,当点击它时,它应该通过串行发送一个命令列表来完成按钮的操作。我在mainwindow.h文件中定义了字符串列表,如下所示: QStringList database_dump = { "STRING1", "STRING2", "STRING3", "STRING4", "STRING5", "STRING6", "STRING7" }; 从我的按钮点击信号中,我想提取每个字符串并将其发送到我的write_to_por

我创建了一个按钮,当点击它时,它应该通过串行发送一个命令列表来完成按钮的操作。我在mainwindow.h文件中定义了字符串列表,如下所示:

QStringList database_dump = 
{
    "STRING1",
    "STRING2",
    "STRING3",
    "STRING4",
    "STRING5",
    "STRING6",
    "STRING7"
};
从我的按钮点击信号中,我想提取每个字符串并将其发送到我的
write_to_port
函数,如下所示:

void MainWindow::on_dump_database_clicked()
{
    QString * file_name;
    QByteArray key_value;

    while(!database_dump.isEmpty())
    {
        file_name = new QString(database_dump.takeFirst());
        key_value = file_name->toLatin1();
        key_value.append(NEW_LINE_CR);
        write_to_port(key_value);
    }
}
在每个字符串之后,需要有一个模拟的回车键,如图所示

问题是:
takefirst()
方法获取字符串并将其从列表中删除。按下按钮的第一个循环工作正常。但是第二次它什么也不做,因为
QStringList
是空的


如何在每次单击按钮后重置字符串列表?

使用
foreach
范围内的
代替
,同时
迭代字符串列表的元素,即:

void MainWindow::on_dump_database_clicked()
{
    foreach (const QString &file_name, database_dump) {
        QByteArray key_value(file_name->toLatin1());

        key_value.append(NEW_LINE_CR);
        write_to_port(key_value);
    }
}


使用
foreach
或范围
for
而不是
while
迭代字符串列表的元素,即:

void MainWindow::on_dump_database_clicked()
{
    foreach (const QString &file_name, database_dump) {
        QByteArray key_value(file_name->toLatin1());

        key_value.append(NEW_LINE_CR);
        write_to_port(key_value);
    }
}



1.这和C有什么关系?2.为什么要从列表中删除项目,而不是简单地遍历它
new QString
对我来说似乎不对。您正在泄漏
QString
s。我不认为新的Qt核心框架(通过查看文档)没有成员函数
takeFirst()
,相反,您可以像使用for循环的普通数组一样循环它。。。那为什么不这样做呢?另外,移动
QString*文件名循环内的定义,或者你必须在每个循环结束时清除它…@Ruks Qt Creator(IDE)与任何事情有什么关系?如果您使用IDE或纯文本编辑器(如记事本)来编写代码,则没有任何区别。这和C有什么关系?2.为什么要从列表中删除项目,而不是简单地遍历它
new QString
对我来说似乎不对。您正在泄漏
QString
s。我不认为新的Qt核心框架(通过查看文档)没有成员函数
takeFirst()
,相反,您可以像使用for循环的普通数组一样循环它。。。那为什么不这样做呢?另外,移动
QString*文件名循环内的定义,或者你必须在每个循环结束时清除它…@Ruks Qt Creator(IDE)与任何事情有什么关系?如果您使用IDE或纯文本编辑器(如记事本)来编写代码,这没有任何区别。为什么不只使用基于纯范围的
for
循环呢?比如(const auto&file\u name:database\u dump)
。@JesperJuhl,我同意。只有一件事:我不记得我在哪里读过这篇文章,但它是关于只有在类型明显时才使用
auto
,如
auto*foo=newfoo()例如。因此,我添加了@eyllanesc的语法作为替代。我使用了foreach选项,它起了作用。谢谢您的帮助@scopchanov.@N.dijkhofz,非常欢迎您!另外,这两个选项都是相同的,应该按照预期工作。文档:自Qt5.7以来,不鼓励使用foreach宏。它将在Qt的未来版本中删除。请根据需要使用C++11范围for,可能与qAsConst()一起使用。为什么不使用基于普通范围的
for
循环?比如(const auto&file\u name:database\u dump)
。@JesperJuhl,我同意。只有一件事:我不记得我在哪里读过这篇文章,但它是关于只有在类型明显时才使用
auto
,如
auto*foo=newfoo()例如。因此,我添加了@eyllanesc的语法作为替代。我使用了foreach选项,它起了作用。谢谢您的帮助@scopchanov.@N.dijkhofz,非常欢迎您!另外,这两个选项都是相同的,应该按照预期工作。文档:自Qt5.7以来,不鼓励使用foreach宏。它将在Qt的未来版本中删除。请根据需要使用C++11范围,可能与qAsConst()配合使用。