Qt学习之使用QListWidget加载本地图片实现双击放大

目录

一、前言

二、实现效果

三、代码实现

(1)QListWidget的使用

1、QListWidget初始化

2、QListWidget加载本地图片

3、QListWidget样式表设计

4、QListWidget连接信号与槽

(2)自定义QWidget(显示放大的图片)

1、imageWin构造函数

2、事件过滤器

四、全部代码

1、listWidgetUse头文件(.h)

2、listWidgetUse源文件(.cpp)

3、imageWin头文件(.h)

4、imageWin源文件(.cpp)


一、前言

        QListWidget的列表项显示方式有两种,一种是IconMode(图标模式),一种是ListMode(列表模式),本文介绍IconMode(图标模式)的使用,加载本地图片,双击列表的每一项可以进行图片放大。

二、实现效果

三、代码实现

(1)QListWidget的使用

1、QListWidget初始化

        设置列表项的大小,设置显示模式,设置大小自适应,设置列表项为静态不可移动。

imgList = new QListWidget;
imgList->setIconSize(QSize(125,125));//设置单个Icon大小
imgList->setViewMode(QListView::IconMode);//设置显示模式
imgList->setFlow(QListView::LeftToRight);//从左到右
imgList->setResizeMode(QListView::Adjust);//大小自适应
imgList->setMovement(QListView::Static);//设置列表每一项不可移动

2、QListWidget加载本地图片

        加载工程目录下的image/pngImage文件夹里的png和jpg格式的图片,如下图所示。

 代码

//path为QString类型
path=QString(QDir::currentPath()+"/image/pngImage/");//本地图片路径
QDir dir(path);

//namefiles和files为QStringList类型
namefiles<<"*.png"<<"*.jpg";

//查找本地图片路径下的png后缀和jpg后缀的图片名  xxx.png  xxx.jpg
files=dir.entryList(namefiles,QDir::Files|QDir::Readable,QDir::Name);

//动态添加item到QListWidget里
for(int i=0;i<files.size();i++)
{
    QListWidgetItem *newitem=new QListWidgetItem(QIcon(QPixmap(path+"/"+files.at(i)).scaled(125, 125)),files.at(i));
    QFileInfo fi = files.at(i);
    newitem->setText(fi.baseName());//Returns the base name of the file without the path
    newitem->setTextAlignment(Qt::AlignHCenter);//设置文字对齐方式:水平居中
    imgList->addItem(newitem);
}

3、QListWidget样式表设计

        通过设计QListWidget样式表,实现鼠标滑过列表每一项有选中的动态效果。

//样式表设计
imgList->setStyleSheet("QListWidget{border:none; color:black;outline:0px; }"
                         "QListWidget::Item{padding-left:0px;padding-top:20px; padding-bottom:4px;color:black}"
                         "QListWidget::Item:hover{background:lightgray; color:green;}"
                         "QListWidget::item:selected{background:lightgray; color:green; }"
                         );

4、QListWidget连接信号与槽

        QListWidget有个列表项双击的信号:itemDoubleClicked(QListWidgetItem*)。

connect(imgList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(enlargeImage(QListWidgetItem *)));

        槽函数:

void listWidgetUse::enlargeImage(QListWidgetItem *item)
{
    QRect rect = this->geometry();//获取当前窗口坐标及大小 x、y、w、h
    
    //通过自定义的窗口显示图片
    imageWin *showImageWidget = new imageWin(item , QRect(rect.x(), rect.y()+rect.y()*1/4, rect.width(), rect.height()*2/3));
    showImageWidget->show();
}

(2)自定义QWidget(显示放大的图片)

        自定义imageWin类继承与QWidget,并重载构造函数。

1、imageWin构造函数

        实现思路为:获取item里的pixmap,然后将pixmap通过QLabel加载显示。

imageWin::imageWin(QListWidgetItem *item, QRect rect, QWidget *parent): QWidget(parent)
{
    qApp->installEventFilter(this);
    this->setGeometry(rect);//设置显示图片窗口的x、y、w、h
    this->setFixedSize(rect.width(), rect.height());//设置窗口固定大小
    this->setWindowIcon(item->icon());
    this->setWindowTitle("查看图片");
    this->setWindowModality(Qt::ApplicationModal);//阻塞除当前窗体外的其他所有窗体

    //通过QLabel加载item上的图片
    QLabel *lab = new QLabel(this);
    lab->setFixedSize(this->width(), this->height());
    lab->setPixmap(item->icon().pixmap(QSize(this->width(), this->height())).scaled(lab->width(),lab->height()));

}

2、事件过滤器

        使用事件过滤器主要目的是实现点击窗口的任意位置可以关闭窗口。

//事件过滤器,实现点击窗口任意位置,窗口就可以关闭
bool imageWin::eventFilter(QObject *obj, QEvent *e)
{
    if(e->type() == QEvent::MouseButtonPress)
    {
        this->close();
    }
    return QWidget::eventFilter(obj, e);
}

四、全部代码

1、listWidgetUse头文件(.h)

#ifndef LISTWIDGETUSE_H
#define LISTWIDGETUSE_H

#include <QWidget>
#include <QListWidget>
#include <QString>

class listWidgetUse : public QWidget
{
    Q_OBJECT
public:
    explicit listWidgetUse(QWidget *parent = 0);

private:
    QListWidget *imgList;
    QString path;
    QStringList namefiles, files;

signals:

public slots:
    void enlargeImage(QListWidgetItem *item);//放大图片
};

#endif // LISTWIDGETUSE_H

2、listWidgetUse源文件(.cpp)

#include "listwidgetuse.h"
#include "imagewin.h"
#include <QVBoxLayout>
#include <QDir>
#include <QDebug>

listWidgetUse::listWidgetUse(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("listWidget的使用");
    this->resize(600, 600);

    imgList = new QListWidget;
    imgList->setIconSize(QSize(125,125));//设置单个Icon大小
    imgList->setViewMode(QListView::IconMode);//设置显示模式
    imgList->setFlow(QListView::LeftToRight);//从左到右
    imgList->setResizeMode(QListView::Adjust);//大小自适应
    imgList->setMovement(QListView::Static);//设置列表每一项不可移动

    path=QString(QDir::currentPath()+"/image/pngImage/");//本地图片路径
    QDir dir(path);

    //namefiles和files为QStringList类型
    namefiles<<"*.png"<<"*.jpg";

    //查找本地图片路径下的png后缀和jpg后缀的图片名  xxx.png  xxx.jpg
    files=dir.entryList(namefiles,QDir::Files|QDir::Readable,QDir::Name);
    for(int i=0;i<files.size();i++)
    {
        qDebug()<<files.at(i);
        QListWidgetItem *newitem=new QListWidgetItem(QIcon(QPixmap(path+"/"+files.at(i)).scaled(125, 125)),files.at(i));
        QFileInfo fi = files.at(i);
        newitem->setText(fi.baseName());//Returns the base name of the file without the path
        newitem->setTextAlignment(Qt::AlignHCenter);
        imgList->addItem(newitem);
    }
    //样式表设计
    imgList->setStyleSheet("QListWidget{border:none; color:black;outline:0px; }"
                             "QListWidget::Item{padding-left:0px;padding-top:20px; padding-bottom:4px;color:black}"
                             "QListWidget::Item:hover{background:lightgray; color:green;}"
                             "QListWidget::item:selected{background:lightgray; color:green; }"
                             );
    connect(imgList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(enlargeImage(QListWidgetItem *)));

    QVBoxLayout *vlayout = new QVBoxLayout(this);
    vlayout->addWidget(imgList);
}

void listWidgetUse::enlargeImage(QListWidgetItem *item)
{
    QRect rect = this->geometry();//获取当前窗口坐标及大小 x、y、w、h

    //通过自定义的窗口显示图片
    imageWin *showImageWidget = new imageWin(item , QRect(rect.x(), rect.y()+rect.y()*1/4, rect.width(), rect.height()*2/3));
    showImageWidget->show();
}

3、imageWin头文件(.h)

#ifndef IMAGEWIN_H
#define IMAGEWIN_H

#include <QWidget>
#include <QListWidget>
#include <QRect>

class imageWin : public QWidget
{
    Q_OBJECT
public:
    imageWin(QListWidgetItem *item, QRect rect, QWidget *parent = 0);
    ~imageWin();

private:
    QListWidget *imageWidget;
    QListWidgetItem *item;

signals:

public slots:

protected:
    bool eventFilter(QObject *obj, QEvent *e);
};

#endif // IMAGEWIN_H

4、imageWin源文件(.cpp)

#include "imagewin.h"
#include <QEvent>
#include <QApplication>
#include <QLabel>
#include <QPixmap>

imageWin::imageWin(QListWidgetItem *item, QRect rect, QWidget *parent): QWidget(parent)
{
    qApp->installEventFilter(this);
    this->setGeometry(rect);//设置显示图片窗口的x、y、w、h
    this->setFixedSize(rect.width(), rect.height());//设置窗口固定大小
    this->setWindowIcon(item->icon());
    this->setWindowTitle("查看图片");
    this->setWindowModality(Qt::ApplicationModal);//阻塞除当前窗体外的其他所有窗体

    //通过QLabel加载item上的图片
    QLabel *lab = new QLabel(this);
    lab->setFixedSize(this->width(), this->height());
    lab->setPixmap(item->icon().pixmap(QSize(this->width(), this->height())).scaled(lab->width(),lab->height()));

}

imageWin::~imageWin()
{
    delete this;
}

//事件过滤器,实现点击窗口任意位置,窗口就可以关闭
bool imageWin::eventFilter(QObject *obj, QEvent *e)
{
    if(e->type() == QEvent::MouseButtonPress)
    {
        this->close();
    }
    return QWidget::eventFilter(obj, e);
}

原创不易,转载请标明出处。

  • 28
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
可以使用 `QStackedWidget` 和 `QListWidget` 实现界面切换功能。 1. 首先,在 Qt Designer 中创建一个 `QStackedWidget` 和一个 `QListWidget`,将 `QListWidget` 放置在需要显示菜单的位置上,将 `QStackedWidget` 放置在需要显示页面的位置上。 2. 在 `QListWidget` 中添加菜单项,并设置相应的文本和图标。 3. 在 `QStackedWidget` 中添加页面,并设置相应的 UI 界面。 4. 编写槽函数,用于响应 `QListWidget` 中菜单项的点击事件,并切换到相应的页面。 以下是示例代码: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QStackedWidget, QWidget, QVBoxLayout, QLabel, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建 QListWidget 和 QStackedWidget self.list_widget = QListWidget() self.stack_widget = QStackedWidget() # 添加菜单项 self.list_widget.addItem("Page 1") self.list_widget.addItem("Page 2") self.list_widget.addItem("Page 3") # 添加页面 page1 = QWidget() layout1 = QVBoxLayout() label1 = QLabel("This is Page 1") button1 = QPushButton("Go to Page 2") button1.clicked.connect(lambda: self.stack_widget.setCurrentIndex(1)) layout1.addWidget(label1) layout1.addWidget(button1) page1.setLayout(layout1) self.stack_widget.addWidget(page1) page2 = QWidget() layout2 = QVBoxLayout() label2 = QLabel("This is Page 2") button2 = QPushButton("Go to Page 3") button2.clicked.connect(lambda: self.stack_widget.setCurrentIndex(2)) layout2.addWidget(label2) layout2.addWidget(button2) page2.setLayout(layout2) self.stack_widget.addWidget(page2) page3 = QWidget() layout3 = QVBoxLayout() label3 = QLabel("This is Page 3") button3 = QPushButton("Go to Page 1") button3.clicked.connect(lambda: self.stack_widget.setCurrentIndex(0)) layout3.addWidget(label3) layout3.addWidget(button3) page3.setLayout(layout3) self.stack_widget.addWidget(page3) # 设置 QMainWindow 的 centralWidget central_widget = QWidget() central_layout = QHBoxLayout() central_layout.addWidget(self.list_widget) central_layout.addWidget(self.stack_widget) central_widget.setLayout(central_layout) self.setCentralWidget(central_widget) # 连接 QListWidget 和 QStackedWidget self.list_widget.currentRowChanged.connect(self.stack_widget.setCurrentIndex) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在上述示例代码中,我们在 QMainWindow 中添加了一个 `QListWidget` 和一个 `QStackedWidget`,并且在 `QListWidget` 中添加了三个菜单项,在 `QStackedWidget` 中添加了三个页面。我们通过 `setCurrentIndex` 方法切换页面,并且连接了 `currentRowChanged` 信号,以便在 `QListWidget` 中点击菜单项时,自动切换到相应的页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

似末

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值