如果它包含在同一列表中的另一个字符串中,我想从QStringList(下面的代码中的文件夹)中删除一个字符串。
示例:" / tmp / a / tmp / b / tmp / a / aa / tmp / c / tmp / a / aa / aaa / tmp / d"
我想删除第一个和第三个字符串,因为它们包含在第五个字符串中。 我知道怎么用bash中的grep来做,但是我怎么用Qt做呢?
void MainWindow::on_toolButtonSourceFolders_clicked()
{
QString startDir = lineEditStartFolder->text();
QFileDialog* folderDialog = new QFileDialog(this);
folderDialog->setDirectory(lineEditStartFolder->text());
folderDialog->setFileMode(QFileDialog::Directory);
folderDialog->setOption(QFileDialog::DontUseNativeDialog, true);
folderDialog->setOption(QFileDialog::ShowDirsOnly, true);
folderDialog->setOption(QFileDialog::DontResolveSymlinks, true);
QListView *folderList = folderDialog->findChild<QListView*>("listView");
if (folderList) {
folderList->setSelectionMode(QAbstractItemView::MultiSelection);
}
QTreeView *folderTree = folderDialog->findChild<QTreeView*>();
if (folderTree) {
folderTree->setSelectionMode(QAbstractItemView::MultiSelection);
}
folderDialog->exec();
QStringList folders = folderDialog->selectedFiles();
if (!folders.isEmpty())
listWidget->addItems(folders);
}
答案 0 :(得分:1)
如评论中所示,由于最大目录数为20,我不打算优化算法,因此我会选择最简单的:
QStringList folders = folderDialog->selectedFiles();
QStringList outputFolders = folders;
foreach (const QString &folder, folders) {
foreach (const QString &f, folders) {
if (f.contains(folder))
outputFolders.removeOne(folder);
}
}
你也可以避免使用临时副本,但是这样会使代码更加复杂,这对于20&#34;文件夹&#34;而言是不值得的。
另外,请注意&#34;文件夹&#34;是一个GUI术语。你所指的是更普遍的文件和目录。最好使用正确的术语,而不是仅仅使用GUI术语。
答案 1 :(得分:1)
稍作修改,我就解决了问题:
QStringList folders = folderDialog->selectedFiles();
QStringList outputFolders = folders;
foreach (const QString &folder, folders) {
foreach (const QString &f, folders) {
const QString &cfolder = (folder + "/");
if (f.contains(cfolder))
outputFolders.removeOne(folder);
}
}
if (!outputFolders.isEmpty())
listWidget->addItems(outputFolders);