listwidget 实现横向流式排布关键以及过滤注意事项

Posted 大蔡一顿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了listwidget 实现横向流式排布关键以及过滤注意事项相关的知识,希望对你有一定的参考价值。

   listWidget里面设置以下属性: 
  this->setViewMode(QListView::IconMode);
    this->setResizeMode(QListView::Adjust);
this->setMovement(QListView::Static);

流式排布过滤时需要注意:
在流式排布中过滤item采用隐藏的方式时,因为采用的是IconMode模式,所以偶尔会出现排版异常问题;
处理方式:在设置QListWidgetItem的对象隐藏时,如果QListWidgetItem的窗体是自定义的话,那么也需要把子窗体也一起隐藏; 如下:
    for(int i=0; i<this->count(); i++)
        QListWidgetItem *pItem = this->item(i);
        if ( pItem )
            QWidget *pItemWidget = this->itemWidget(pItem);
            if ( !pItemWidget ) return ;
            CListItem *pClistItem = (CListItem*)(pItemWidget);
            bool isItemVisable = pClistItem->data().toString().contains(str, Qt::CaseSensitive);
            pItem->setHidden(!isItemVisable);
            pClistItem->setHidden(!isItemVisable);          //TODO: 注意: 使用IconMode模式时, 除开listWiget的item要隐藏外,自定义的widget也要隐藏
        




如何过滤所选目录中的图像文件(在 listWidget 内)

【中文标题】如何过滤所选目录中的图像文件(在 listWidget 内)【英文标题】:How to filter image files from selected directory (which is inside listWidget) 【发布时间】:2018-07-16 07:07:54 【问题描述】:

我有一个问题,我不知道如何过滤所选目录中的图像。我通常使用directory.setNameFilters("*.png", "*.jpg");,但在这种情况下我不能使用它,因为我需要使用listWidget 中的选定目录。我使用信号和槽函数。我的意思是,如果我单击listWidget 中的目录,则该目录中的图像将显示在另一个listWidget 中。如果我单击另一个目录,它将执行相同的功能。请看一下我的代码。

QDir directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home", QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
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);

for(const QFileInfo & finfo: directory.entryInfoList())
    ui->listWidget_dirs->addItem(finfo.absoluteFilePath());


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

    listWidget_images->show();

    directory.setNameFilters("*.png", "*.jpg");

    for(const QFileInfo & finfo: directory.entryInfoList())
        QListWidgetItem *item = new QListWidgetItem(QIcon(finfo.absoluteFilePath()), finfo.fileName());
        listWidget_images->addItem(item);
    
);

【问题讨论】:

【参考方案1】:

您必须使用 QListWidgetItem 的文本创建 QDir。

另一方面,用于获取子目录列表的方法是获取文件和目录而不区分彼此,我已经修复了该部分。

QString directory = QFileDialog::getExistingDirectory(this,
                                                      tr("Open Directory"),
                                                      QDir::homePath(),
                                                      QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
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);

QDirIterator diter(directory, QDir::Dirs | QDir::NoDotAndDotDot);

while (diter.hasNext()) 
    ui->listWidget_dirs->addItem(diter.next());



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

    listWidget_images->show();
    listWidget_images->clear();
    QDir directory(item->text());
    directory.setNameFilters("*.png", "*.jpg");
    for(const QFileInfo & finfo: directory.entryInfoList())
        QListWidgetItem *item = new QListWidgetItem(QIcon(finfo.absoluteFilePath()), finfo.fileName());
        listWidget_images->addItem(item);
    
);

【讨论】:

天啊,我已经尝试了 3 天。 @eyllanesc 非常感谢。

以上是关于listwidget 实现横向流式排布关键以及过滤注意事项的主要内容,如果未能解决你的问题,请参考以下文章

使用 tweepy 流式传输用户的时间线和过滤的推文

设计模式之使用Java 流式过滤实现过滤器模式链式过滤

webform复合控件以及用来做年月日选择日期的DropDownList控件

复合控件选择类

复合控件:选择类

Qt程序怎么实现选中ListWidget中的某一行为默认选中状态啊?在线 急