很多的时候我们需要制作类似手机的中的电子相框, 可以用listwidget 控件实现  直接上代码 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->move(0,0);

//    ui->listWidget->resize(365,400);
    //设置QListWidget的显示模式
    ui->listWidget->setViewMode(QListView::IconMode);
    //设置QListWidget中单元项的图片大小
    ui->listWidget->setIconSize(QSize(278,278));
    //设置QListWidget中单元项的间距
    ui->listWidget->setSpacing(10);
    //设置自动适应布局调整(Adjust适应,Fixed不适应),默认不适应
    ui->listWidget->setResizeMode(QListWidget::Adjust);
    //设置不能移动
    ui->listWidget->setMovement(QListWidget::Static);

    connect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(listWidgetClicked(QListWidgetItem*)));

    //显示图像空间的照片数量
//    QString  imageWorkPath=imagePATH;  //  /home/wanghuixi/keysiQt/workspace
    QDir * imagePath=new QDir("./123/");
    QStringList filter;
    filter << "*.jpg"<< "*.png"  ;
    QList<QFileInfo> *fileInfo=new QList<QFileInfo>(imagePath->entryInfoList(filter));
    int imageSum = fileInfo->count();//the file have "."and ".." file
    QList<QString>  fileNames;
    fileNames.clear();
    if(imageSum == 0)
    {
        return;
    }
    for(int i=0;i<imageSum;i++)
    {
      fileNames.append(fileInfo->at(i).filePath());
    }
    for(auto tmp : fileNames)
    {
        qDebug()<<tmp<<endl;
        ui->listWidget->addItem(new QListWidgetItem(QIcon(tmp),"Tornado"));
    }


}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::listWidgetClicked(QListWidgetItem *item)
{
    qDebug() << "ddsfsdf"  << "   "<<item->text() << "  " << ui->listWidget->currentIndex().row() << "   "<< ui->listWidget->count()<< endl;
    ui->listWidget->removeItemWidget(item);
    delete item;
}

运行的结果就是

可以点击指定的照片会返回照片的编号 我们可以根据照片的编号 可以干很多事情 。

 工程链接 

https://pan.baidu.com/s/1kYtFou2q-xu6SapUzA6TTw

 还有一种可以限制 图片为指定大小的 添加到listwidget中  思路就是把 QLabel 控件添加到listwidget 里面

        QLabel * labelP = new QLabel;
        labelP->setFixedSize(278,278);   //:/123/3.jpg
         labelP->setStyleSheet(tr("border-image: url(:/123/3.jpg);color: transparent;"));  //background-color: rgb(102, 194, 255);
        QListWidgetItem *aItemHome = new QListWidgetItem(ui->listWidget);
        aItemHome->setSizeHint(QSize(278,278));
        ui->listWidget->addItem(aItemHome);
        ui->listWidget->setItemWidget(aItemHome,labelP);

 有的时候listwidget 有很多用处接下来我介绍一下 动态布局并且能滑动显示按钮

主要代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QListWidgetItem>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QDebug>
#include <QLabel>
#include <QMoveEvent>
#include <QDir>
#include <QStandardItem>
#include <QStringList>
#include <QListWidgetItem>
#include <QPushButton>
#include <QMouseEvent>

#include "pushbutton.h"


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    QPoint pointStart;//大按钮的滑动的开始坐标
    int currentPosX;// 当前位置的 x值
    QPoint pointEnd; //
    int posX ; //大图标的 X坐标
    bool eventFilter(QObject *,QEvent *);
private slots:
    void listWidgetClicked(QListWidgetItem*); //listWidgetDoubleClicked
    void listWidgetDoubleClicked(QListWidgetItem*);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->move(0,0);
        this->setFixedSize(1920,800); //设置窗体固定大小

    //    ui->listWidget->resize(365,400);
        //设置QListWidget的显示模式
        ui->listWidget->setViewMode(QListView::IconMode);
        //设置QListWidget中单元项的图片大小
        ui->listWidget->setIconSize(QSize(278,278));
        //设置QListWidget中单元项的间距
        ui->listWidget->setSpacing(10);
        //设置自动适应布局调整(Adjust适应,Fixed不适应),默认不适应
        ui->listWidget->setResizeMode(QListWidget::Adjust);
        //设置不能移动
        ui->listWidget->setMovement(QListWidget::Static);

        connect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(listWidgetClicked(QListWidgetItem*)));
        connect(ui->listWidget, SIGNAL( itemDoubleClicked ( QListWidgetItem *  ) ), this, SLOT(listWidgetDoubleClicked( QListWidgetItem * )));


        //显示图像空间的照片数量
    //    QString  imageWorkPath=imagePATH;  //  /home/wanghuixi/keysiQt/workspace
        QDir * imagePath=new QDir("./123/");
        QStringList filter;
        filter << "*.jpg"<< "*.png"  ;
        QList<QFileInfo> *fileInfo=new QList<QFileInfo>(imagePath->entryInfoList(filter));
        int imageSum = fileInfo->count();//the file have "."and ".." file
        QList<QString>  fileNames;
        fileNames.clear();
        if(imageSum == 0)
        {
            return;
        }
        for(int i=0;i<imageSum;i++)
        {
          fileNames.append(fileInfo->at(i).filePath());
        }
        for(auto tmp : fileNames)
        {
            qDebug()<<tmp<<endl;
            ui->listWidget->addItem(new QListWidgetItem(QIcon(tmp),"Tornado"));

            QLabel * labelP = new QLabel;

            labelP->setFixedSize(278,278);   //:/123/3.jpg
            labelP->setStyleSheet(tr("border-image: url(:/123/3.jpg);border-radius:10px;color: transparent;"));  //background-color: rgb(102, 194, 255);
            QListWidgetItem *aItemHome = new QListWidgetItem(ui->listWidget);
            aItemHome->setSizeHint(QSize(278,278));
            ui->listWidget->addItem(aItemHome);
            ui->listWidget->setItemWidget(aItemHome,labelP);
        }

        ui->listWidget->installEventFilter(this);
        ui->listWidget->setMouseTracking(true);
        ui->listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        ui->listWidget->setVerticalScrollMode(QListWidget::ScrollPerPixel);



//          QListWidgetItem *item=new QListWidgetItem(ui->listWidget2,0);

//          item->setSizeHint(QSize(10,10));

//          QPushButton *pushButton=new QPushButton();

//          ui->listWidget2->setItemWidget(item,pushButton);
//          ui->listWidget2->show();
for(int i=0; i<20;i++)
    {
        QPushButton *pushButton=new QPushButton();
        QListWidgetItem *aItemHome = new QListWidgetItem(ui->listWidget2,i);
        aItemHome->setSizeHint(QSize(27,27));
        pushButton->setFixedSize(27,27);
        ui->listWidget2->addItem(aItemHome);
        ui->listWidget2->setSpacing(10);
        ui->listWidget2->setItemWidget(aItemHome,pushButton);
    }



//            QListWidget *list=new QListWidget;
//            QListWidgetItem *item=new QListWidgetItem(list,0);

//            item->setSizeHint(QSize(100,100));
//            QWidget *w = new QWidget(list);
//            QHBoxLayout *layout=new QHBoxLayout(w);
//            QPushButton *pushButton=new QPushButton(w);
//            QCheckBox *checkBox=new QCheckBox(w);
//            layout->addWidget(checkBox);
//            layout->addWidget(pushButton);
//            w->setLayout(layout);
//            w->show();
//            list->setItemWidget(item,w);
//            list->show();


    QGridLayout *layout=new QGridLayout(ui->widget);
    layout->setContentsMargins(0,0,0,0);
    layout->setSpacing(0);

    int sum = 100;
    int row = 0;//hang
    int Column = 4;//lie
    int num =0;//jishu
    int ColumnNum[4]= {1,3,5,7};
    if(sum%Column)
        {
        row = sum /Column +1;
    }
    else
        {
        row = sum /Column;
    }
//    item->setSizeHint(QSize(1705,sum*30));
    ui->widget->setFixedSize(1705,sum*30);
    layout->setColumnStretch(0,10);
    layout->setColumnStretch(1,20);
    layout->setColumnStretch(2,10);
    layout->setColumnStretch(3,20);
    layout->setColumnStretch(4,10);
    layout->setColumnStretch(5,20);
    layout->setColumnStretch(6,10);
    layout->setColumnStretch(7,20);
    layout->setColumnStretch(8,10);

    for(int i = 1;i<=row; i++)
    {
        layout->setRowStretch(i*2-2,20);

        for(int j=0; j<Column;j++)
            {
            if(num >= sum)
                {break;}

            PushButton *pushButton=new PushButton(QString::number(num, 10) );
            pushButton->installEventFilter(this);
            pushButton->setMouseTracking(true);
            pushButton->setFixedSize(20,20);
            layout->addWidget(pushButton,i*2-2,ColumnNum[j]);
            num++;
        }
        layout->setRowStretch(i*2-1,10);
    }
    ui->widget->installEventFilter(this);
    ui->widget->setMouseTracking(true);
    ui->widgetWai->installEventFilter(this);
    ui->widgetWai->setMouseTracking(true);
    ui->widget->setLayout(layout);
    ui->widget->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::listWidgetClicked(QListWidgetItem *item)
{
    qDebug() << "单击相应"  << "   "<<item->text() << "  " << ui->listWidget->currentIndex().row() << "   "<< ui->listWidget->count()<< endl;
//    ui->listWidget->removeItemWidget(item);
//    delete item;
}

void MainWindow::listWidgetDoubleClicked(QListWidgetItem *item)
{
    qDebug() << "双击的"  << "   "<<item->text() << "  " << ui->listWidget->currentIndex().row() << "   "<< ui->listWidget->count()<< endl;
    ui->listWidget->removeItemWidget(item);
    delete item;
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
  bool statues = false;
     QMouseEvent *mouseEvent = (QMouseEvent *)event;
    static int i= 0;
    i++;
//        qDebug() << "对象:" <<watched->objectName()<< i <<"事件:"<<event->type()<< endl;
//        if (watched==ui->informationPB ||watched==ui->knowledgePB||watched==ui->messagePB ||watched==ui->reservationPB  )
//            {
                if(event->type() == QEvent::MouseButtonPress)//:Paint
                {
                    statues = true;
                    pointStart = mouseEvent->pos();
                    currentPosX = ui->widget->y();
                    qDebug() << "****************按下" << endl;
                }
                if(event->type() == QEvent::MouseMove)//MouseMove
                {
//                    if(statues == false)
//                       {}
//                    else
//                       {
                        pointEnd = mouseEvent->pos();
                        posX = currentPosX + (pointEnd.y() - pointStart.y());
                        ui->widget->move(0,posX);
                        if(posX <ui->widgetWai->height() - ui->widget->height() )
                        {
                        ui->widget->move(0,ui->widgetWai->height() - ui->widget->height());
                        }
                        if(posX >ui->widget->height() - ui->widgetWai->height())
                        {

                        ui->widget->move(0,0);
                        }

                        qDebug() << "/////////////////移动" << posX <<endl;
//                    }


                }
                if(event->type() == QEvent::Leave)
                {
                    qDebug() << "--------------------------离开" << endl;
                }
                if(event->type() == QEvent::Paint)
                {

                    qDebug() << "-------------------------Paint" << endl;
                }
                if(event->type() == QEvent::MouseButtonRelease)
                {
                    statues = false;
                    qDebug() << "--------------------------抬起" << ui->widgetWai->height() - ui->widget->height() << endl;
//                    if(posX < ui->widgetWai->height() - ui->widget->height())
//                    {
//                        ui->widget->move(0,ui->widgetWai->height() - ui->widget->height());
//                    }
//                    if(posX >0 )
//                    {
//                        ui->widget->move(0,0);
//                    }

                }

//            }
    return QWidget::eventFilter(watched,event);     // 最后将事件交给上层对话框
}
#ifndef PUSHBUTTON_H
#define PUSHBUTTON_H

#include <QObject>
#include <QWidget>
#include <QDebug>
#include <QPushButton>

class PushButton : public QPushButton
{
    Q_OBJECT
public:
    explicit PushButton(QString name);

signals:
private slots:
    void PushButtonClickedSlots();
public slots:
};

#endif // PUSHBUTTON_H
#include "pushbutton.h"

PushButton::PushButton(QString name)
{
    this->setText(name);
    connect(this,SIGNAL(clicked(bool)),this,SLOT(PushButtonClickedSlots()));
}
void PushButton::PushButtonClickedSlots()
{
    qDebug() << this->text() << endl;
}

工程见此链接 

链接:https://pan.baidu.com/s/10pb59Ii-b_yjMuDx-Okrdw 密码:gtte