Как захватить родительский каталог из лямбды

В моем коде я перечисляю имя подкаталога (только дочерний каталог), и если я щелкаю по этому подкаталогу, будут отображаться изображения внутри этого подкаталога. В моем случае я не могу захватить родительский каталог изнутри лямбда. Как я могу это сделать?

Dir directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",

                                                   QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
for (const QFileInfo &finfo: directory.entryInfoList()) {
    QDir dir(finfo.absoluteFilePath());
    ui->listWidget_dirs->addItem(dir.dirName());
}

//QStringList files = directory.entryList(QDir::Dirs);
//ui->listWidget_dirs->addItems(files);

auto listWidget_images = new QListWidget();//set listwidget to display images
listWidget_images->setMinimumSize(1200,400);
listWidget_images->setViewMode(QListWidget::IconMode);
listWidget_images->setIconSize(QSize(320,240));
listWidget_images->setResizeMode(QListWidget::Adjust);




connect(ui->listWidget_dirs, & QListWidget::itemClicked,[listWidget_images,this](QListWidgetItem *item)
{
    listWidget_images->show();
    listWidget_images->clear();
   /*this is where it is wrong*/ QDir path(directory + '/' + item->text());
    path.setNameFilters({"*.png", "*.jpg"});
    for(const QFileInfo & finfo: path.entryInfoList()){
        QListWidgetItem *item = new QListWidgetItem(QIcon(finfo.absoluteFilePath()), finfo.fileName());
        listWidget_images->addItem(item);

    }
});

2 ответа

Решение

Я просто хотел оставить записку. Убедитесь, что ваши объекты живы во время вашей лямды, особенно listWidget_images. Если вы удалите его в другом месте, ваша лямда рухнет. Я бы порекомендовал немного изменить соединительную линию:

от

connect(ui->listWidget_dirs, & QListWidget::itemClicked,[directory,listWidget_images, this](QListWidgetItem *item)

в

connect(ui->listWidget_dirs, & QListWidget::itemClicked, listWidget_images, [directory,listWidget_images, this](QListWidgetItem *item)

Если вы поместите указатель listWidget_images перед списком захвата [], то лямда будет уничтожена, когда объект из listWidget_images будет уничтожен. В противном случае ваше приложение потерпит крах в первой строке вашей лямды, если объект больше не существует.

Ну, я понимаю, как это сделать, это код.

QDir directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",

                                                   QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
for (const QFileInfo &finfo: directory.entryInfoList()) {
    QDir dir(finfo.absoluteFilePath());
    ui->listWidget_dirs->addItem(dir.dirName());
}

auto listWidget_images = new QListWidget();//set listwidget to display images
listWidget_images->setMinimumSize(1200,400);
listWidget_images->setViewMode(QListWidget::IconMode);
listWidget_images->setIconSize(QSize(320,240));
listWidget_images->setResizeMode(QListWidget::Adjust);

connect(ui->listWidget_dirs, & QListWidget::itemClicked,[directory,listWidget_images, this](QListWidgetItem *item)
{
    listWidget_images->show();
    listWidget_images->clear();
    // QDir path(item->text());
    QDir dir = directory.absolutePath() + '/' + item->text();
    dir.setNameFilters({"*.png", "*.jpg"});
    for(const QFileInfo & finfo: dir.entryInfoList()){
        QListWidgetItem *item = new QListWidgetItem(QIcon(finfo.absoluteFilePath()), finfo.fileName());
        listWidget_images->addItem(item);

    }
});
Другие вопросы по тегам