Qt5.9中使用列表控件QListWidget显示缩略图(完全模仿Windows图片视图文档)

本文主要用关键代码,介绍用Qt的QListWidget控件显示缩略图,实现图片底端居中对齐,文字顶端居中对齐。(提醒:可以直接跳过从后面的步骤1.1开始看起)

注意关键函数用法总结:

void QListWidget::addItem(QListWidgetItem *aitem):QListWidget添加QListWidgetItem项。

QListWidgeItem::setIcon(QIcon):设置QListWidgeItem项的图标。

QListWidgeItem::setTxt(QString):设置QListWidgeItem项的内容,通常和setIcon()函数搭配使用,上面是图标下面是文字。

void setSizeHint(const QSize &size):设置QListWidgeItem项的单元格大小。如果把每一个QListWidgeItem等同于与一个QPushbutton按钮,则该函数可以理解为设置QPushbutton按钮的尺寸大小,因为每一个QListWidgeItem项都可以跟按钮一样实现触发和鼠标滑过,被选中功能。

void itemClicked(QListWidgetItem *item):单击QListWidgeItem项时触发一个信号。可以通过函数QListWidget::row(item)在获取当前选中的是哪一个QListWidgetItem 项。注意:加入有九宫格排列的QListWidgetItem,其在QListWidget中的排列顺序是从左到右,从上到下进行排序的。即:

0  1  2

3  4  5

6  7  8

void setItemWidget(QListWidgetItem *item, QWidget *widget):将QListWidgetItem和QWidget关联起来,其中QWidget可以是一个QWidget,也可以是一个QPushbutton按钮。

列表控件QListWidge主要是通过包含一系列的QListWidgeItem项来进行显示,换句话说,列表控件QListWidge是QListWidgeItem项的集合。其中,列表控件QListWidge包含QListWidgeItem项主要用到函数void QListWidget::addItem(QListWidgetItem *aitem);下面是一个具体示例。

recoveryListWidget->addItem(listWidgetItem);

所以,我们要实现的是在每一个QListWidgeItem项中显示上面是图片,下面是文字。如果要显示的图片大小是固定的,可以直接用函数QListWidgeItem::setIcon(QIcon)和函数QListWidgeItem::setTxt(QString)来实现。两个函数的用法跟QPushbutton的用法一模一样,可以直接把QListWidgeItem当成一个按钮来处理就好。

但是,我所做项目需要显示的图片大小的任意的,而显示图片的位置是在一个给定的方框内。要实现这种方式显示图片,第一步就是在每一个QListWidgeItem项中嵌入一个QWidget,然后再在这个QWidget中实现任意想要的效果。比如图片底端居中对齐,文字顶端居中对齐。QListWidgeItem项中嵌入一个QWidget需要用到函数void setItemWidget(QListWidgetItem *item, QWidget *widget):

void setItemWidget(QListWidgetItem *item, QWidget *widget);

下面是一个应用实例:

recoveryListWidget->setItemWidget(listWidgetItem,itemWidget);

1.1实现上述功能,只需要调用下面两个函数即可实现。

initListWidget();
createPictureListWidget();

函数initListWidget()定义如下:

void RecoveryGuidePage::initListWidget()
{
    ICON_SIZE = QSize(240,150);
    CELL_SIZE = QSize(240,190);
    recoveryListWidget = new QListWidget(this);
    thirdStackRightWidgetLayout->addWidget(recoveryListWidget);
    recoveryListWidget->setIconSize(ICON_SIZE);
    recoveryListWidget->setResizeMode(QListView::Adjust);
    recoveryListWidget->setViewMode(QListView::IconMode);
    recoveryListWidget->setMovement(QListView::Static);

    recoveryListWidget->setSpacing(10);
    recoveryListWidget->setStyleSheet("QListWidget{background-color:rgb(11,13,17);color:white;outline:none;border:1px solid#404F6C;}"
                                      "QListWidget::Item:hover{background:rgb(8,52,127);}"
                                      "QListWidget::item:selected{background:rgb(8,52,127);}"
                                     );

    recoveryListWidget->horizontalScrollBar()->setDisabled(true);
    recoveryListWidget->verticalScrollBar()->setStyleSheet("QScrollBar:vertical{ background:#111; width:15px;}"
                                                  "QScrollBar::handle:vertical{background:url(:/res/ui/bg_bar2.png); min-height:60px;}"
                                                  "QScrollBar::handle:vertical:hover{background:url(:/res/ui/bg_bar2.png);}"
                                                  "QScrollBar::add-line:vertical{background:url(:/res/ui/bg_bar3.png) center no-repeat;}"
                                                  "QScrollBar::sub-line:vertical{background:url(:/res/ui/bg_bar1.png) center no-repeat;}"
                                                  "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background:#111;}");

    imageShowLabel = new QLabel;
    imageShowLabel->setWindowTitle("Image Show");
    imageShowLabel->setAlignment(Qt::AlignCenter);
}

函数createPictureListWidget()定义如下:

void RecoveryGuidePage::createPictureListWidget()
{
    recoveryListWidget->clear();
    //获取文件夹下的文件名称
    imageFolderPath = "D:/svn1.1/code/mobileforensics/res/recoverydata/picture";
//    imageFolderPath = "D:/svn1.1/code/mobileforensics/res/recoverydata/icon";
    QDir dir(imageFolderPath);
    if (!dir.exists()) {
        return;
    }
    dir.setFilter(QDir::Files | QDir::NoSymLinks);
    QStringList filters;
    filters << "*.png" << "*.jpg";
    dir.setNameFilters(filters);
    allImageNameList = dir.entryList();
    if (allImageNameList.count() <= 0)
    {
        return;
    }

    // 创建单元项
    for (int i = 0; i<allImageNameList.count(); ++i)
    {
        QPixmap pixmap(imageFolderPath + "\\" + allImageNameList.at(i));
        QListWidgetItem *listWidgetItem = new QListWidgetItem;
        QWidget *itemWidget = new QWidget;
        QVBoxLayout *itemWidgetLayout = new QVBoxLayout;
        QLabel *imageLabel = new QLabel;
        QLabel *txtLabel = new QLabel(tr("%1").arg(allImageNameList.at(i)));
        itemWidget->setLayout(itemWidgetLayout);
        itemWidgetLayout->setMargin(0);
        itemWidgetLayout->setSpacing(0);
        itemWidgetLayout->addWidget(imageLabel);
        itemWidgetLayout->addWidget(txtLabel);
        if(pixmap.width()>150||pixmap.height()>150)
        {
            pixmap=pixmap.scaled(150,150,Qt::KeepAspectRatio);
        }
//        qDebug()<<"pixmap.width()=="<<pixmap.width()<<"pixmap.height()=="<<pixmap.height();

        imageLabel->setPixmap(pixmap);
        imageLabel->setStyleSheet("QLabel{background-color:transparent;margin-bottom:10}");
        imageLabel->setAlignment(Qt::AlignBottom|Qt::AlignHCenter);
        txtLabel->setStyleSheet("QLabel{color:white;background-color:transparent;font:14px}");
        txtLabel->setFixedHeight(30);
        txtLabel->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
        txtLabel->setWordWrap(true);

        listWidgetItem->setSizeHint(QSize(150,190));
        recoveryListWidget->addItem(listWidgetItem);
        recoveryListWidget->setSizeIncrement(150,190);
        recoveryListWidget->setItemWidget(listWidgetItem,itemWidget);
    }

    // 信号与槽
    connect(recoveryListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(On_clickedListWidgetItem(QListWidgetItem*)));
//    qDebug()<<allImageNameList;
}

1.2实现的效果如下图所示:

参考内容:

https://blog.csdn.net/csdn1027192411/article/details/52123556(重点参考)

https://blog.csdn.net/qq_20991549/article/details/79524256(主要参考在QListWidget中嵌入QWidget用法)

猜你喜欢

转载自blog.csdn.net/naibozhuan3744/article/details/81070068