如何将 QListView 中的每个元素添加到向量中?
How can I add each element from a QListView into a vector?
只是想表明我是 C++ 的初学者。我正在尝试获取 QListView 中的所有元素并将它们插入 Vector。
这是我的加载数据集函数,它将文件从文件夹加载到 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 函数,它获取用户单击的文件并将其加载到 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,您可以使用 initializer list:
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
的通常用例),您还可以考虑定义您自己的字符串 literal operator 为了更简洁:
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"};
哪个会更快,也更干净。
只是想表明我是 C++ 的初学者。我正在尝试获取 QListView 中的所有元素并将它们插入 Vector。
这是我的加载数据集函数,它将文件从文件夹加载到 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 函数,它获取用户单击的文件并将其加载到 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,您可以使用 initializer list:
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
的通常用例),您还可以考虑定义您自己的字符串 literal operator 为了更简洁:
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"};
哪个会更快,也更干净。