QT C++中基于文件名长度和整数序列的元素排序

cgvd09ve  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(214)

我尝试使用qtsringlist()对文件名进行排序,但是我不确定如何在QT中使用normalsorting。
“图像1.png”“图像10.png”“图像100.png”
用“image2.png”代替“image1.png”,以此类推。然后,我将列表添加到列表小部件中。下面我附上了我的代码。QStringList faList;(在头文件初始化)
帮帮忙。谢谢。

void QtWidgetsApplication::displayImagesList() {
    QListWidgetItem *item = new QListWidgetItem();
    QDirIterator it(QStringLiteral("C:\\Users\\Documents\\Visual Studio 2015\\Projects\\cas\\images"),
        QStringList() << "*.png", QDir::Files, QDirIterator::Subdirectories);
    QFileInfo files;
    while (it.hasNext()) {
        QFileInfo file(it.next());
        faList.append(file.fileName());
        
        ui.images->setSortingEnabled(true);
    
        //ui.images->sortItems(Qt::AscendingOrder);
        _files.push_back(file.fileName());

        //cout << file.fileName().toStdString() << "\n";
        //Cout << file.fileName().length() << "\n";

        //if (file.fileName().length() == 17) {
        //  cout << file.fileName().toStdString() << "\n";
        //  
        //}

    }
    ui.images->addItems(faList);
    ui.images->setMinimumWidth(ui.images->sizeHintForColumn(0));
}
brtdzjyr

brtdzjyr1#

如果你需要项目按“自然”顺序排序,你可以使用QCollator并利用它的numeric mode
示例代码(未测试)...

auto strings = QStringList{}
  << "image_3.png"
  << "image_1.png"
  << "image_4.png"
  << "image_7.png"
  << "image_2.png"
  << "image_10.png"
  << "image_5.png"
  << "image_0.png"
  << "image_8.png"
  << "image_6.png"
  << "image_9.png"
  ;
QCollator col;
col.setNumericMode(true);
std::sort(strings.begin(), strings.end(),
          [&](const QString &a, const QString &b)
            {
              return col.compare(a, b) < 0;
            });
q7solyqu

q7solyqu2#

你不能根据字符串的数字后缀对它们进行排序。
最简单的方法是重命名图像,使数字部分补零:image001.png,... image100.png,则常规排序将起作用。
或者,您可以提供自己的比较函数,将文件名解析为文本部分和数字部分,并根据需要进行比较。

相关问题