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