Qt制作一个ListView列表
一、概述
案例:使用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:QPointstartPoint;MainListViewItemtheHighlightItemnullptr;MainListViewItemoldHighlightItemnullptr;MainListViewItemtheSelectedItemnullptr;MainListViewItemoldSelectedItemnullptr;Chapter3OptionoptionnewChapter3Option();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){oldHighlightItemtheHighlightItem;theHighlightItemstaticcastMainListViewItem(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:itemmPos;switch(itemmPos){case1:显示原图optionshowSrcImage(fileRealPath);break;case2:像素取反optionpixleReverse(fileRealPath);break;case3:图像融合optionimageFuse(,);break;case4:调整图像亮度及对比度optionincreaseBrightnessContrastRatio(fileRealPath);break;case5:绘制线、矩形、椭圆、圆、多边形、文本optiondrawShape();break;case6:均值模糊:用于图像的降噪optionshowBlur(fileRealPath);break;case7:高斯模糊:用于图像的降噪,其对自然界的噪声有很好的抑制作用optionshowGaussianBlue(fileRealPath);break;case8:中值滤波:终止滤波用于图像的降噪,其对椒盐噪声有很好的抑制作用(黑白点)optionshowMediaBlur(fileRealPath);break;case9:双边滤波:其可以很好的保留边缘的同时对平坦区域进行降噪optionshowBilateralFilter(fileRealPath);break;case10:提起图像中的英文字母optionshowCleanImage(fileRealPath);break;case11:形态学开操作optionshowImageOpen(fileRealPath);break;case12:形态学闭操作optionshowImageClose(fileRealPath);break;case13:形态学梯度(基本梯度):膨胀减去腐蚀optionshowMorphologicalGradient(fileRealPath);break;case14:顶帽操作:相当于原图像与开操作之间的差值图像optionshowTopHat(fileRealPath);break;case15:黑帽操作:相当于原图像与闭操作之间的差值图像optionshowBlackHat(fileRealPath);break;case16:小案例:提取提取项目中的字母或者直线optionshowLines(fileRealPath,0);break;case17:上采样:利用拉普拉斯金字塔进行图像重建optionshowPyrUp(fileRealPath);break;case18:降采样:利用高斯金字塔进行降采样optionshowPyrDown(fileRealPath);break;case19:高斯不同:把同一张图片再不同的参数下做高斯模糊之后的结果相减,得到的输出图像称为高斯不同optionshowGaussianDiff(fileRealPath);break;case20:使用自定义卷积核filter2DoptionshowCustomKernelFilter2D(fileRealPath,1);break;case21:1。合并rebort和sobel的x方向梯度和y方向的梯度optionshowCustomKernelFilter2DMergeXY(fileRealPath);break;case22:填充图像边缘optionshowCopyMakeBorder(fileRealPath);break;case23:使用Sobel和Scharr计算图形梯度optionshowSobelAndScharr(fileRealPath);break;case24:使用拉普拉斯算子显示梯度图像optionshowLaplacian(fileRealPath);break;case25:边缘检测optionshowCanny(fileRealPath);break;}}}释放鼠标briefMainListView::mouseReleaseEventparameventvoidMainListView::mouseReleaseEvent(QMouseEventevent){如果鼠标释放位置和单击位置相距超过5像素,则不会触发item选中if((eventpos()startPoint)。manhattanLength()5)return;MainListViewItemitemstaticcastMainListViewItem(itemAt(eventpos()));setCurrentItem(item);}处理鼠标离开后,hover图标回复正常状态briefMainListView::leaveEventparameventvoidMainListView::leaveEvent(QEventevent){QUNUSED(event);oldHighlightItemtheHighlightItem;if(oldHighlightItem!oldHighlightItemisSelected())oldHighlightItemsetIcon(oldHighlightItemmIcon);oldHighlightItemtheHighlightItemnullptr;}voidMainListView::updateSelectedIcon(){oldSelectedItemtheSelectedItem;theSelectedItemstaticcastMainListViewItem(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:QIconmIcon;默认图标QIconmIconHover;选中时图标intmPos;第一个编辑signals:};
mainlistviewitem。cppincludemainlistviewitem。h自定义主页ListView的Item项briefMainListViewItem::MainListViewItemparamparentMainListViewItem::MainListViewItem(QStringitemTitle,constQIconicon,constQIconiconHover,intpos,QListWidgetparent):QListWidgetItem(parent){setText(itemTitle);mIconicon;mIconHovericonHover;setIcon(mIcon);setSizeHint(QSize(360,47));mPospos;}
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:0px;}除去复选框MainListViewItem{background:rgb(245,245,247);border:0px;margin:0px0px0px0px;}MainListViewItem::Item{height:40px;border:0px;paddingleft:14px;color: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开发中文网