很多的时候我们需要制作类似手机的中的电子相框, 可以用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