使用虚列表和自画实现文件夹的缩略图显示

基于PyQt5实现查看本地图片功能 基于Python和PyQt5实现查看本地图片功能 通过点击按钮打开本地文件夹选择图片进行显示,也可扩展选择图片路径后自动获取图片数量及相关信息·实现翻页、轮播图等效果和功能。 效果 查看本地图片示例程序 # -*- coding: utf-8 -*- """ 基于PyQt5实现查看本地图片功能 """ import os import sys from PyQt5.QtGui import QIcon, QCursor, QPixmap from PyQt5.QtWidgets impo. 阅读详情
 

本示例演示了列表控件的虚列表和自画功能,也演示了一些系统外壳的函数和接口的使用方法。

单击 这里 下载本文的代码。

预备性阅读

在阅读本文之前,建议先对列表视图控件和系统外壳有一个基本的了解。建议阅读以下SDK文章

创建应用程序

使用MFC应用程序向导创建一个SDI应用程序,在最后一步选择视图的基类为CListView。创建完成之后,在资源中去掉保存、编辑和打印等功能的菜单和工具栏按钮(因为这些功能没有实现)。

虚列表的创建

本文采用虚列表技术,使得显示信息是在第一次显示的时候才被获取。为了创建虚列表,在创建之前需要指定列表的风格

BOOL CPicViewView::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.style&=~LVS_TYPEMASK;
    cs.style|=LVS_ICON|LVS_OWNERDATA;
    return CListView::PreCreateWindow(cs);
}
同时,因为列表项的Overlay图标也是被动态获取的,所以需要设置动态Overlay图标

void CPicViewView::OnInitialUpdate()
{
    CListView::OnInitialUpdate();
    GetListCtrl().SetCallbackMask(LVIS_OVERLAYMASK);
}

缓存显示信息

在列表需要显示一个范围的项目之前,列表会发送LVN_ODCACHEHINT通知,应用程序可以捕获这个消息来缓存部分列表的显示信息,以提高性能。

void CPicViewView::OnOdcachehint(NMHDR* pNMHDR, LRESULT* pResult)
{
    NMLVCACHEHINT* pCacheHint = (NMLVCACHEHINT*)pNMHDR;
    PrepCache(0,min(5,m_arpFolderItems.GetSize()));
    PrepCache(pCacheHint->iFrom,pCacheHint->iTo);
    PrepCache(max(0,m_arpFolderItems.GetSize()-5),m_arpFolderItems.GetSize());
    *pResult = 0;
}
在列表需要显示一个项目之前,列表会发送LVN_GETDISPINFO通知,应用程序可以捕获这个消息来提供项目的显示信息。如果显示时需要显示的列表项在缓存中,那么可以从缓存中获取显示信息。否则需要重新从文件获得。

void CPicViewView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    if(pDispInfo->item.iItem==-1)return;
    HRESULT hr=S_OK;
    LPCITEMIDLIST pidlItem=m_arpFolderItems[pDispInfo->item.iItem];
    CFolderItemInfo* pFolderItemInfo=FindItemInCache(pidlItem);
    BOOL bCached=TRUE;
    if(pFolderItemInfo==NULL){
        bCached=FALSE;
        pFolderItemInfo=new CFolderItemInfo;
        GetItemInfo(pidlItem,pFolderItemInfo);
    }
    if(pDispInfo->item.mask&LVIF_TEXT){
        lstrcpyn(pDispInfo->item.pszText,pFolderItemInfo->tszDisplayName,pDispInfo-   >item.cchTextMax);
    }
    if(pDispInfo->item.mask&LVIF_IMAGE){
        pDispInfo->item.iImage=pFolderItemInfo->iIcon;
    }
    if(pDispInfo->item.mask&LVIF_STATE){
        pDispInfo->item.state=pFolderItemInfo->state;
    }
    if(!bCached)
        delete pFolderItemInfo;
    *pResult = 0;
}


文件图标的显示

默认情况下,列表项的图标就是其系统图标。首先获得系统图像列表

int CPicViewView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CListView::OnCreate(lpCreateStruct) == -1)
        return -1;
    HRESULT hr = SHGetMalloc(&m_pMalloc); if(FAILED(hr)) return -1;
    hr = SHGetDesktopFolder(&m_psfDesktop);if(FAILED(hr)) return -1;
    SHFILEINFO shfi;
    ZeroMemory(&shfi,sizeof(SHFILEINFO));
    HIMAGELIST hi=(HIMAGELIST)SHGetFileInfo(NULL,0,&shfi,sizeof(SHFILEINFO),SHGFI_ICON |SHGFI_SYSICONINDEX|SHGFI_SMALLICON);
    GetListCtrl().SetImageList(CImageList::FromHandle(hi),LVSIL_SMALL);
    hi=(HIMAGELIST)SHGetFileInfo(NULL,0,&shfi,sizeof(SHFILEINFO),SHGFI_ICON |SHGFI_SYSICONINDEX|SHGFI_LARGEICON);
    GetListCtrl().SetImageList(CImageList::FromHandle(hi),LVSIL_NORMAL);
    return 0;
}

然后在获取文件信息时,从文件获得其图标在系统图像列表中的索引。

如果列表项是图像文件,并且从文件成功载入图像,那么使用自画功能以替换默认的图标。

void CPicViewView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMLVCUSTOMDRAW lpNMCustomDraw = (LPNMLVCUSTOMDRAW) pNMHDR;
    switch(lpNMCustomDraw ->nmcd.dwDrawStage) {
        case CDDS_PREPAINT : *pResult=CDRF_NOTIFYITEMDRAW;return;
        case CDDS_ITEMPREPAINT:*pResult=CDRF_NOTIFYPOSTPAINT;return;
        case CDDS_ITEMPOSTPAINT:
        {
            int iItem=lpNMCustomDraw ->nmcd.dwItemSpec;
            if(iItem==-1){
                *pResult=CDRF_DODEFAULT;return;
            }
            CFolderItemInfo* pItemInfo=FindItemInCache(m_arpFolderItems[iItem]);
            if(pItemInfo==NULL||pItemInfo->bFailLoadPic||pItemInfo->pic.m_pPict==NULL){
                *pResult=CDRF_DODEFAULT;return;
            }
            CRect rectIcon;
            GetListCtrl().GetItemRect(iItem,&rectIcon,LVIR_ICON);
            CDC* pDC=CDC::FromHandle(lpNMCustomDraw->nmcd.hdc);
            pItemInfo->pic.Render(pDC,rectIcon,rectIcon);
        }
        *pResult=CDRF_NEWFONT;return;
    }
    * pResult=0;
}

上面的代码是使用获取的文件显示信息中的图像,在列表项图标的区域画图。

获取显示信息

为了缓存列表项的显示信息,或者显示列表项,需要获取列表项的文字、图标、Overlay图标和缩略图等信息。这里使用了ILCombine来把缓存中的相对PIDL转化为完整的Pidl,再据此获得文件的完整路径,然后调用OleLoadPicturePath函数载入图像。

void CPicViewView::GetItemInfo(LPCITEMIDLIST pidl,CFolderItemInfo* pItemInfo)
{
    HRESULT hr = theApp.SHGetDisplayNameOf(pidl,pItemInfo->tszDisplayName);
    IShellIcon* pShellIcon=NULL;
    hr=m_psfFolder->QueryInterface(IID_IShellIcon,(LPVOID*)&pShellIcon);
    if (SUCCEEDED(hr)&&pShellIcon){
        pShellIcon->GetIconOf(pidl,0,&pItemInfo->iIcon);
        pShellIcon->Release();
    }
    IShellIconOverlay* pShellIconOverlay =NULL;
    hr=m_psfFolder->QueryInterface(IID_IShellIconOverlay,(LPVOID*)&pShellIconOverlay);
    if (SUCCEEDED(hr)&&pShellIconOverlay){
        int nOverlay=0;
        pShellIconOverlay->GetOverlayIndex(pidl,&nOverlay);
        pItemInfo->state=INDEXTOOVERLAYMASK (nOverlay);
        pShellIconOverlay->Release();
    }
    LPITEMIDLIST pidlItemFull=ILCombine(m_pidlFolder,pidl);
        if(pidlItemFull){
            if(SHGetPathFromIDList(pidlItemFull,pItemInfo->tszPath)){
                USES_CONVERSION;
                hr=OleLoadPicturePath(
                    T2OLE(pItemInfo->tszPath)
                    ,NULL,0,RGB(255,255,255)
                    ,IID_IPicture,(LPVOID*)&pItemInfo->pic.m_pPict);
            if(FAILED(hr)){
                    pItemInfo->bFailLoadPic=TRUE;
                    TRACE("OleLoadPicturePath failed %s/r/n",pItemInfo->tszPath);
                }
            }
        }
        m_pMalloc->Free(pidlItemFull);
    }
}

缓存目录的数据

在更改目录时,需要重建目录内容的缓存。这包括目录的pidl和IShellFolder接口指针,目录内容的相对pidl,以及列表项的显示信息(基于性能上的考虑,列表项的显示信息是在接收到LVN_ODCACHEHINT通知的时候缓存的)。

LPITEMIDLIST m_pidlFolder;
IShellFolder * m_psfFolder;
CTypedPtrArray<CPtrArray,LPITEMIDLIST> m_arpFolderItems;
CTypedPtrMap<CMapPtrToPtr,LPITEMIDLIST,CFolderItemInfo*> m_mapCache;
 

void CPicViewView::EnterFolder(LPCITEMIDLIST pidl)
{
    USES_CONVERSION;
    m_pidlFolder=ILClone(pidl);
    if(m_pidlFolder){
        LPENUMIDLIST ppenum = NULL;
        LPITEMIDLIST pidlItems = NULL;
        ULONG celtFetched;
        HRESULT hr;
        hr = m_psfDesktop->BindToObject(m_pidlFolder, NULL, IID_IShellFolder, (LPVOID *) &m_psfFolder);
        if(SUCCEEDED(hr)){
            hr = m_psfFolder->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
            if(SUCCEEDED(hr)){
                while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1){
                    m_arpFolderItems.Add(pidlItems);
                    }
            }
        }
        GetListCtrl().SetItemCount(m_arpFolderItems.GetSize());
    }
}

 

打开文件夹

本应用程序显示文件夹的内容而不是显示文档的内容,所以我重载了打开文件时的处理,显示目录选择对话框而不是文件打开对话框。

void CPicViewApp::OnFileOpen()
{
    TCHAR tszDisplayName[_MAX_PATH];
    TCHAR tszPathSelected[_MAX_PATH];
    LPITEMIDLIST pidlSelected=PidlBrowse(m_pMainWnd->GetSafeHwnd(),0,tszDisplayName);
    if(pidlSelected){
        if(SHGetPathFromIDList(pidlSelected,tszPathSelected)){
            CDocument* pDocument=OpenDocumentFile(tszPathSelected);
            pDocument->SetTitle(tszDisplayName);
            ILFree(pidlSelected);
        }
    }
}

注意从外壳调用获得的PIDL一般都需要调用ILFree或者IMalloc::Free释放。一个例外是调用函数SHBindToParent获得的相对pidl,因为它是输入的参数完整pidl的一部分,所以不必另外释放。

在新建或者打开“文件”时候,文档需要通知视图当前文件夹的更改,这是通过调用CDocument::UpdateAllViews和重载CView::OnUpdate实现的。视图对这个通知的处理是清除上一个目录的缓存数据,缓存新目录的数据,以及更新文档标题。
 

打开文件或者目录

为了使用方便,双击列表项时可以在同一窗口打开子目录,或者调用系统的默认处理程序打开文件。如果文件是快捷方式,那么打开快捷方式的目标。

void CPicViewView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMLISTVIEW lpnm=(LPNMLISTVIEW)pNMHDR;
    if(lpnm->iItem==-1)return;
    *pResult = 0;
    HRESULT hr=S_OK;
    LPCITEMIDLIST pidlItem=m_arpFolderItems[lpnm->iItem];
    LPITEMIDLIST pidlItemFull=ILCombine(m_pidlFolder,pidlItem);
    LPITEMIDLIST pidlItemTarget=NULL;
    hr=theApp.SHGetTargetFolderIDList(pidlItemFull,&pidlItemTarget);
    if(pidlItemTarget){
        if(theApp.ILIsFolder(pidlItemTarget)){
            CFolderChange FolderChange;
            FolderChange.m_pidlFolder=pidlItemTarget;
            OnFolderChange(&FolderChange);
        }
        else{
            SHELLEXECUTEINFO ShExecInfo;
            ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
            ShExecInfo.fMask = SEE_MASK_IDLIST;
            ShExecInfo.hwnd = NULL;
            ShExecInfo.lpVerb = NULL;
            ShExecInfo.lpFile = NULL;
            ShExecInfo.lpIDList= pidlItemTarget;
            ShExecInfo.lpParameters = NULL;
            ShExecInfo.lpDirectory = NULL;
            ShExecInfo.nShow = SW_MAXIMIZE;
            ShExecInfo.hInstApp = NULL;
            ShellExecuteEx(&ShExecInfo);
        }
        m_pMalloc->Free(pidlItemTarget);
        m_pMalloc->Free(pidlItemFull);
    }
}
 

性能的优化

为了更好的用户体验,可以使用自定义的图标大小(这需要完全自行绘制列表项的图标区域),用单独的线程来载入图像,或者使用调整到图标大小的缩略图缓冲(这样每次绘制时不必拉伸图像)。但是这超出了本文的范围。有兴趣的读者可以自己试一下。

参考

需要更多信息的话,可以参考

MFC略缩图控件 MFC略缩图控件,列表框自绘,VS2008+sp1编译。 立即下载

相关推荐

mfc下实现缩略图

VS2005下 MFC实现缩略图的DEMO,供新手学习使用

pyqt5中常用元件、小方法的使用记录(打开文件、显示图片、背景加图片、提示框)

使用元件时最好给每个元件单独加后缀。

qin_liang的博客 390

VoIP概述

VoIP统一通信与VoIPVoIP与传统电话比较VoIP各项产品设备的类型及应用 统一通信与VoIP 统一通信指的是把计算机与传统通信技术统一成一体的新通信模式,融合计算机网络与传统通信网络在一个网络平台上,实现电话、传真、数据传输、音视频会议、呼叫中心、即时通信等众多应用服务 VoIP又称IP电话或IP网络电话,是Voice Over IP的缩写,这种技术通过对语音信号进行编码数字化,压缩处理成压缩帧,然后转换成为IP数据包在TCP/IP网络上进行传输,从而达到了在IP网络上进行语音通信目的 VoIP与传

kaminao的博客 4356

【目标检测】YOLOv5-PyQT可视化例程开发

花了几天功夫做了一个YOLOv5的PyQT可视化程序,主要针对多幅图片训练、自动标注和检测展示。

兴趣使然的创作者 5477

ADS系列之SI&PI仿真笔记:ADS多种版本的安装、卸载&重装(一)

此系列仅作为ADS学习过程的记录,如有错误的地方还请大佬指正! 一、下载&安装 ADS软件下载&安装还算比较简单,目前接触到有两个版本:ADS2017和ADS2019。这里贴下链接,破解教程里面都有: ADS2017下载地址:https://pan.baidu.com/s/1l-Bs9owKRmp5Pv0Mt92OYA 提取码:wuzf ADS2019下载地址:吴川斌的博客-w...

Claudedy的博客 3万+

驱动钛丝(SMA)的应用(5)汽车腰托气阀常见问题及解决方案

财哥在前段时间发布的《驱动钛丝(SMA)的应用(1)汽车腰托支撑按摩气阀模块》一文,引发了很多企业的拜访和交流。 目前很多厂家已经启动或正在进行相关研发,同时也遇到了诸如:钛丝选型、驱动位移、响应设计、温度控制、力量设计、点动滞后、铆接工艺、量化生产等问题。

weixin_39168671的博客 1239

使用虚列表和自画实现文件夹缩略图的显示

本示例演示了列表控件的虚列表和自画功能,也演示了一些系统外壳的函数和接口的使用方法。 预备性阅读 在阅读本文之前,建议先对列表视图控件和系统外壳有一个基本的了解。建议阅读以下SDK文章 Shell FAQ List-View Controls Overview Using List-View Controls Customizing a Control's Appearance Using Cu

千里之外 1647

飞牛NAS 0day漏洞导致断网?完整的排查修复方案来了(含一键检测修复工具)

家里网络莫名断网,折腾十来天才发现是NAS被0day漏洞利用了?🔍 本文详细记录了从发现问题到最终解决的全过程,包括如何自查系统是否被入侵、使用检测脚本和专杀脚本进行修复,以及如何通过端口管理、访问控制、监控预警等措施加固系统安全 🔒,帮助遇到同样问题的用户快速排查和解决NAS安全风险 ✅

XiaoqiangClub的博客 5511

VC一点通:实现文件夹的缩略图显示

VC一点通:实现文件夹的缩略图显示。 <br />  本示例演示了列表控件的虚列表和自画功能,也演示了一些系统外壳的函数和接口的使用方法。<br />  预备性阅读<br />  在阅读本文之前,建议先对列表视图控件和系统外壳有一个基本的了解。建议阅读以下SDK文章<br />  ShellFAQ<br />List-ViewControlsOverview<br />UsingList-ViewControls<br />CustomizingaControl'sAppearanc

scollins的专栏 1945

33、嵌入式系统中的内存操作与实时操作系统

本博客详细探讨了嵌入式系统中的内存操作和实时操作系统(RTOS)的基本原理及应用。内容涵盖C、C++和MicroPython三种语言下的SDRAM读写示例,并结合机器人真空吸尘器的实际应用说明内存的使用场景。此外,还介绍了RTOS的核心概念、组件及其工作机制,包括任务、事件、互斥锁、信号量、队列等,并以FreeRTOS和Mbed OS为例展示了RTOS的配置与使用方法。最后,通过常见问题和实践项目加深对嵌入式系统开发的理解。

zz67890的博客 144

国产服务器系统的PXE无人值守自动化安装部署——以银河麒麟、统信UOS、OpenEuler这三类服务器系统为例

本文详细介绍了三种国产服务器系统(银河麒麟、统信UOS、OpenEuler)的PXE无人值守自动化安装方法。主要内容包括:1)从系统ISO镜像中提取内核文件和根系统文件;2)编写GRUB菜单引导文件;3)配置自动应答文件实现自动化安装;4)重启PXE服务并测试安装过程。文章特别强调了硬盘容量需≥100GB、UEFI模式设置等注意事项,并提供了root密码重置方法。对于x86架构Windows上模拟ARM架构系统安装也给出了具体命令。通过完整的配置流程,可实现国产服务器系统的快速批量部署。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1464

MFC实现文件夹的缩略图显示

本示例演示了列表控件的虚列表和自画功能,也演示了一些系统外壳的函数和接口的使用方法。 预备性阅读 在阅读本文之前,建议先对列表视图控件和系统外壳有一个基本的了解。建议阅读以下SDK文章  ShellFAQ List-ViewControlsOverview UsingList-ViewControls CustomizingaControl''sAppea

zhrquan的专栏 1960

近五年体内微/纳米机器人赋能肿瘤精准治疗综述:以 GBM 为重点

摘要 微/纳米机器人在实体瘤治疗领域展现出突破性潜力,通过主动运动能力解决传统纳米药物递送效率低、渗透不足等核心问题。2021-2025年间形成三条技术路线:1) 磁驱、声驱等运动增强递送实现深层渗透;2) 与免疫治疗融合实现原位免疫唤醒;3) 针对胶质母细胞瘤开发跨屏障递送系统。研究重点从单一运动性能转向"运动-分布-疗效"的系统评价,需建立标准化指标评估运动学参数、肿瘤分布均匀性和安全性。未来挑战在于临床转化的可制造性、闭环操控及生物相容性优化,特别是对血脑屏障穿透等复杂场景的系统集

AllenLV的博客 5105

pyqt5改写wheelEvent实现ctrl+鼠标滑轮预览缩放图片,持续优化中!!!附上纯手工最全中文注释

【代码】pyqt5改写wheelEvent实现ctrl+鼠标滑轮预览缩放图片,持续优化中!!!附上纯手工最全中文注释。

weixin_56314292的博客 1165

笔试题-2023-芯动-数字IC设计【纯净题目版】

笔试题-2023-芯动-数字IC设计【纯净题目版】

w0shishabi的博客 6394

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

PyQt5 界面显示文件夹里多张图片,并对图片右键菜单进行操作 新手向备忘录

最近需要写一个训练数据清洗筛选的辅助小工具,之前一直习惯用tkinter来写些小工具,没有接触过PyQt。但是看需求感觉用tkinter不是很好实现(应该是我太菜了),想到以前同事推荐过我用QT,所以这是一篇PyQt5新手小白三天来学习的备忘录。 首先,PyQt5的安装。直接pip安装的方式给我后面打包成exe挖了一个坑。因为版本的原因,打包出来的exe会爆找不到PyQt5模块,后来回滚到5.1...

qq_42516200的博客 8526

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

pyqt 万能简易模板(二)

本文将介绍一些pyqt5基本使用技巧,不借助Qtdesigner,而是全部用代码编写,将实现页面布局、窗口自适应、字体自适应等功能。一般的简易工程均可使用,简单高效。对于pyqt5的一些基本技巧,本文内容基本够用,可以快速实现自己想要的界面。 9、QLabel (1)设置文本内容:mylabel.setText("文本内容") (2)设置Label控件大小自适应内容:mylabel.setWordWrap(True) 10、QLabel显示图片 (1)读取图片: 1)直接读取...

叶子的博客 2468

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

QListWidget方式显示缩略图

最近在工作中经常遇到了一个问题就是把把文件夹中的图片全部以缩略图的形式显示出来,刚开始的时候一头雾水,不知道怎么办,经过在网上查资料,发现QListWidget控件可以实现图片的缩略图显示,但是不知道怎么利用这个控件实现这个功能,网上有很多例子,但是在windows系统上用Qt编译这些程序以后却得不到理想的效果,虽然也可以让这些图片以缩略图的形式显示,但是都必须把这些图片做成资源文件,这和平时的开

feiyangyangfei的专栏 7465

【Qt 学习之路】模仿Windows文件夹缩略图(QWidget、Qt Quick(QML)、以及QGraph)

文章目录1、简介2、效果图3、三种实现方式3.1、QWidget的mask遮罩3.1.1、bb叨3.1.2、核心源码3.2、QML的QtGraphicalEffects遮罩3.2.1、bb小叨3.2.2、核心源码3.3、QGraph的三板斧3.3.1、bb一小会儿3.3.2、核心源码 1、简介 放纵了自己一个月没写博客,如今又提起战刀杀回战场,奈何这硝烟已淡去了你的味道…… 言归正传,本文讲的不是简单的model/view或者widget的或者QML的基础框架实现,而是在这些框架之上的肉(文件夹缩略图)的效

沙师弟专栏 1万+

手把手教你学习PyQT5:打造精美、功能强大的桌面应用程序(更新中。。)

PyQt5是一个用于创建图形用户界面(GUI)的Python库。它是基于Qt库的,Qt是一个用于创建跨平台应用程序的C++库。PyQt5允许开发人员使用Python语言创建功能强大的应用程序PyQt5是一个用于创建图形用户界面(GUI)的Python库。

艰难困苦,玉汝于成。 14万+
上一篇: 利用ShlWapi.dll得到超长路径名的缩写格式
下一篇: 在应用程序中集成自动完成功能
xmlscript
博客等级 码龄25年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值