很多的時候我們需要制作類似手機的中的電子相框, 可以用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