簡體   English   中英

如何將 QListView 中的每個元素添加到向量中?

[英]How can I add each element from a QListView into a vector?

只是想把它放在那里,我是 C++ 的初學者。 我正在嘗試獲取 QListView 中的所有元素並將它們插入到 Vector 中。

這是我的加載數據集 function,它將文件從文件夾加載到 QListView:

void MainWindow::on_actionLoad_Dataset_triggered()
{
    QString sPath = QFileDialog::getExistingDirectory(this, tr("Choose catalog"), ".", QFileDialog::ReadOnly);
    QStringList filter;
    filter << QLatin1String("*.png");
    filter << QLatin1String("*.jpeg");
    filter << QLatin1String("*.jpg");
    filter << QLatin1String("*.gif");
    filter << QLatin1String("*.raw");
    filemodel -> setNameFilters(filter);

    ui -> imgList -> setRootIndex(filemodel -> setRootPath(sPath)); 
}

這是我的 QList function 然后獲取用戶單擊的文件並將其加載到 PixMap 上:

void MainWindow::on_imgList_clicked(const QModelIndex &index)
{
    imgNames = {};

    QString sPath = filemodel -> fileInfo(index).path();

    QString paths = filemodel -> fileInfo(index).fileName();

    //this kind of does it but instead of pushing them all it only pushes the ones that the user has clicked on instead of all
    imgNames.push_back(paths);

    map -> filename = filemodel -> filePath(index);

    map -> loadImage(scene);
    scene -> addItem(map);
}

如果您的問題是如何初始化QStringList ,使用 C++11 您可以使用 初始化列表

const auto filter = QStringList{
  QLatin1String("*.png"), 
  QLatin1String("*.jpeg"), 
  QLatin1String("*.jpg"),
  QLatin1String("*.gif"),
  QLatin1String("*.raw") };
filemodel -> setNameFilters( filter );

事實上,您可以刪除QStringList的顯式實例並將其縮短為:

filemodel -> setNameFilters( {
  QLatin1String("*.png"), 
  QLatin1String("*.jpeg"), 
  QLatin1String("*.jpg"),
  QLatin1String("*.gif"),
  QLatin1String("*.raw") } );

如果您要強制翻譯所有字符串/Unicode 友好,除非那些明確選擇退出( QLatin1String的通常用例),您還可以考慮定義自己的字符串文字運算符以使其更簡潔:

inline QLatin1String operator""_QL1( const char* str, std::size_t len ) 
{ return QLatin1String( str, len ); }
...
filemodel -> setNameFilters( { "*.png"_QL1, "*.jpeg"_QL1, "*.jpg"_QL1, 
                               "*.gif"_QL1, "*.raw"_QL1 } );

您可以像這樣從QListView獲取所有項目的列表:

    auto* m = qobject_cast<QStringListModel*>(ui->listView->model());
    const QStringList &list = m->stringList();
    QVector<QString> vec;
    std::vector<QString> vec2;
    for (const auto& l : list) {
        //using QVector
        vec.append(l);
        //or std::vector
        vec2.push_back(l);
        qDebug() << l;
    }

作為旁注,您可以使用初始化列表初始化您的QStringList ,如下所示:

QStringList list = {"item1", "item2", "item3"};

這將更快,更清潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM