• QT listwiget 控件添加图片


    很多的时候我们需要制作类似手机的中的电子相框, 可以用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
  • 相关阅读:
    照到抄的。C# 多线程自己写的包装器
    转的一份代码应该是 max的吧..
    WPF 里面的 Run .感觉这名称真没取好,application 里面有个 run, textblock 里面也有个.
    Marshal C#
    VS2010推荐实用插件
    Aga.Controls.Tree.TreeViewAdv使用教程之概要介绍
    文档批量下载器
    有趣,http请求接收网站
    Dictionary, KeayValuePair,HashMap,HashTable,待学补充
    kafka和zookeeper的安装
  • 原文地址:https://www.cnblogs.com/wanghuixi/p/9298403.html
Copyright © 2020-2023  润新知