一、概述 案例:使用Qt制作一个ListView。点击ListView的Item可以用于测试OpenCV的各种效果 自定义一个:MainListView继承QListWidget、MainListViewItem继承QListWidgetItem二、代码示例 1。自定义QListWidget mainlistview。hclassMainListView:publicQListWidget{QOBJECTpublic:explicitMainListView(QWidgetparentnullptr);protected:voidmousePressEvent(QMouseEventevent);voidmouseReleaseEvent(QMouseEventevent);voidmouseMoveEvent(QMouseEventevent);voidleaveEvent(QEventevent);private:QPointstartPMainListViewItemtheHighlightIMainListViewItemoldHighlightIMainListViewItemtheSelectedIMainListViewItemoldSelectedIChapter3OptionoptionnewChapter3Option();signals:publicslots:voidupdateSelectedIcon();voidonMainItemClick(QListWidgetItemitem);}; mainlistview。cppincludemainlistview。hMainListView::MainListView(QWidgetparent):QListWidget(parent){setMouseTracking(true);连接信号与槽函数,如果选中项发生变化则触发item图标的更新。都是当前对象发生connect(this,MainListView::itemSelectionChanged,this,MainListView::updateSelectedIcon);connect(this,MainListView::itemClicked,this,MainListView::onMainItemClick);}处理鼠标hove事件,item图标就变成hove状态briefMainListView::mouseMoveEventparameventvoidMainListView::mouseMoveEvent(QMouseEventevent){oldHighlightItemtheHighlightItheHighlightItemstaticcastMainListViewItem(itemAt(eventpos()));旧的hover的item图标回复原状(条件是该item没有被选中)新的hover的iten图标变成hover状态(条件是该item没有被选中)if(oldHighlightItem!theHighlightItem){if(oldHighlightItem!oldHighlightItemisSelected())oldHighlightItemsetIcon(oldHighlightItemmIcon);if(theHighlightItem!theHighlightItemisSelected())theHighlightItemsetIcon(theHighlightItemmIconHover);}}鼠标按下(这个可以当做item的点击事件,能够正常执行)briefMainListView::mousePressEventparameventvoidMainListView::mousePressEvent(QMouseEventevent){if(eventbuttons()Qt::LeftButton){startPointeventpos();MainListViewItemitemstaticcastMainListViewItem(itemAt(eventpos()));QStringfilePathQFileDialog::getOpenFileName(this,tr(选择视频),C:Userswei。yangDownloadsopencvres,tr(ImageFiles(。jpg。png)));constcharfileRealPathfilePath。toStdString()。cstr();将QString转换为charqDebug()itemtext()fileRealPathpos:itemmPswitch(itemmPos){case1:显示原图optionshowSrcImage(fileRealPath);case2:像素取反optionpixleReverse(fileRealPath);case3:图像融合optionimageFuse(,);case4:调整图像亮度及对比度optionincreaseBrightnessContrastRatio(fileRealPath);case5:绘制线、矩形、椭圆、圆、多边形、文本optiondrawShape();case6:均值模糊:用于图像的降噪optionshowBlur(fileRealPath);case7:高斯模糊:用于图像的降噪,其对自然界的噪声有很好的抑制作用optionshowGaussianBlue(fileRealPath);case8:中值滤波:终止滤波用于图像的降噪,其对椒盐噪声有很好的抑制作用(黑白点)optionshowMediaBlur(fileRealPath);case9:双边滤波:其可以很好的保留边缘的同时对平坦区域进行降噪optionshowBilateralFilter(fileRealPath);case10:提起图像中的英文字母optionshowCleanImage(fileRealPath);case11:形态学开操作optionshowImageOpen(fileRealPath);case12:形态学闭操作optionshowImageClose(fileRealPath);case13:形态学梯度(基本梯度):膨胀减去腐蚀optionshowMorphologicalGradient(fileRealPath);case14:顶帽操作:相当于原图像与开操作之间的差值图像optionshowTopHat(fileRealPath);case15:黑帽操作:相当于原图像与闭操作之间的差值图像optionshowBlackHat(fileRealPath);case16:小案例:提取提取项目中的字母或者直线optionshowLines(fileRealPath,0);case17:上采样:利用拉普拉斯金字塔进行图像重建optionshowPyrUp(fileRealPath);case18:降采样:利用高斯金字塔进行降采样optionshowPyrDown(fileRealPath);case19:高斯不同:把同一张图片再不同的参数下做高斯模糊之后的结果相减,得到的输出图像称为高斯不同optionshowGaussianDiff(fileRealPath);case20:使用自定义卷积核filter2DoptionshowCustomKernelFilter2D(fileRealPath,1);case21:1。合并rebort和sobel的x方向梯度和y方向的梯度optionshowCustomKernelFilter2DMergeXY(fileRealPath);case22:填充图像边缘optionshowCopyMakeBorder(fileRealPath);case23:使用Sobel和Scharr计算图形梯度optionshowSobelAndScharr(fileRealPath);case24:使用拉普拉斯算子显示梯度图像optionshowLaplacian(fileRealPath);case25:边缘检测optionshowCanny(fileRealPath);}}}释放鼠标briefMainListView::mouseReleaseEventparameventvoidMainListView::mouseReleaseEvent(QMouseEventevent){如果鼠标释放位置和单击位置相距超过5像素,则不会触发item选中if((eventpos()startPoint)。manhattanLength()5)MainListViewItemitemstaticcastMainListViewItem(itemAt(eventpos()));setCurrentItem(item);}处理鼠标离开后,hover图标回复正常状态briefMainListView::leaveEventparameventvoidMainListView::leaveEvent(QEventevent){QUNUSED(event);oldHighlightItemtheHighlightIif(oldHighlightItem!oldHighlightItemisSelected())oldHighlightItemsetIcon(oldHighlightItemmIcon);oldHighlightItemtheHighlightI}voidMainListView::updateSelectedIcon(){oldSelectedItemtheSelectedItheSelectedItemstaticcastMainListViewItem(currentItem());之前被选中的item图标回复原样新被选中的item图标变成hover状态if(oldSelectedItem!theSelectedItem){if(oldSelectedItem)oldSelectedItemsetIcon(oldSelectedItemmIcon);if(theSelectedItem)theSelectedItemsetIcon(theSelectedItemmIconHover);}}这个槽函数并没有执行voidMainListView::onMainItemClick(QListWidgetItemitem){qDebug()点击了item的项目;} 2。自定义QListWidgetItem mainlistviewitem。hclassMainListViewItem:publicQListWidgetItem{QOBJECT由于QListWidgetItem没有QObject属性,所以QOBJECT需要注释掉public:explicitMainListViewItem(QStringitemTitle,constQIconicon,constQIconiconHover,intpos,QListWidgetparentnullptr);设置item的图标briefsetItemIconparamiconparamiconHovervoidsetItemIcon(constQIconicon,constQIconiconHover);public:QIconmI默认图标QIconmIconH选中时图标intmP第一个编辑signals:}; mainlistviewitem。cppincludemainlistviewitem。h自定义主页ListView的Item项briefMainListViewItem::MainListViewItemparamparentMainListViewItem::MainListViewItem(QStringitemTitle,constQIconicon,constQIconiconHover,intpos,QListWidgetparent):QListWidgetItem(parent){setText(itemTitle);mImIconHovericonHsetIcon(mIcon);setSizeHint(QSize(360,47));mP} 3。使用voidMainWindow::createListView(QWidgetparent){listViewnewMainListView(this);listViewsetFocusPolicy(Qt::NoFocus);这样可禁用tab键和上下方向键并且除去复选框listViewsetFixedHeight(320);listViewsetFont(QFont(宋体,14,QFont::DemiBold));listViewsetFixedSize(QSize(360,480));listViewmove(0,menuBar()height());listViewsetStyleSheet({outline:0}除去复选框MainListViewItem{background:rgb(245,245,247);border:0margin:0px0px0px0}MainListViewItem::Item{height:40border:0paddingleft:14color:rgba(200,40,40,255);}MainListViewItem::Item:hover{color:rgba(40,40,200,255);}MainListViewItem::Item:selected{background:rgb(230,231,234);color:rgba(40,40,200,255);borderleft:4pxsolidrgb(180,0,0);}QListWidget::Item:selected:active{background:rgb(230,231,234);color:rgba(40,40,200,255);borderleft:4pxsolidrgb(180,0,0);});newMainListViewItem(显示原图,QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),1,listView);newMainListViewItem(tr(像素取反),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),2,listView);newMainListViewItem(tr(图像融合),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),3,listView);newMainListViewItem(tr(调整图像亮度及对比度),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),4,listView);newMainListViewItem(tr(绘制线、矩形、椭圆、圆、多边形、文本),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),5,listView);newMainListViewItem(tr(均值模糊),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),6,listView);newMainListViewItem(tr(高斯模糊),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),7,listView);newMainListViewItem(tr(中值滤波),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),8,listView);newMainListViewItem(tr(双边滤波),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),9,listView);newMainListViewItem(tr(提取图像中的英文字母),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),10,listView);newMainListViewItem(tr(形态学开操作),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),11,listView);newMainListViewItem(tr(形态学闭操作),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),12,listView);newMainListViewItem(tr(形态学梯度(基本梯度)),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),13,listView);newMainListViewItem(tr(顶帽操作),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),14,listView);newMainListViewItem(tr(黑帽操作),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),15,listView);newMainListViewItem(tr(小案例:提取提取项目中的字母或者直线),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),16,listView);newMainListViewItem(tr(上采样),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),17,listView);newMainListViewItem(tr(降采样),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),18,listView);newMainListViewItem(tr(高斯不同),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),19,listView);newMainListViewItem(tr(使用自定义卷积核filter2D),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),20,listView);newMainListViewItem(tr(合并rebort及Sobel的x方向梯度和y方向的梯度),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),21,listView);newMainListViewItem(tr(填充图像边缘),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),22,listView);newMainListViewItem(tr(使用Sobel和Scharr计算图形梯度),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),23,listView);newMainListViewItem(tr(使用拉普拉斯算子显示梯度图像),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),24,listView);newMainListViewItem(tr(边缘检测),QIcon(:resiconmainlist。png),QIcon(:resiconmainlist。png),25,listView);connect(listView,MainListView::itemClicked,listView,MainListView::onMainItemClick);}最后一步:创建ListView,然后运行就行了createListView(this); 三、图片演示 原文链接:Qt制作一个ListView列表QT开发中文网