QT實(shí)現(xiàn)制作一個(gè)ListView列表的示例代碼
1、概述
案例:使用Qt制作一個(gè)ListView。點(diǎn)擊ListView的Item可以用于測(cè)試OpenCV的各種效果
自定義一個(gè):MainListView繼承QListWidget 、MainListViewItem繼承QListWidgetItem
2、代碼示例
1.自定義QListWidget
mainlistview.h
class MainListView : public QListWidget
{
Q_OBJECT
public:
explicit MainListView(QWidget *parent = nullptr);
protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void leaveEvent(QEvent *event);
private:
QPoint startPoint;
MainListViewItem *theHighlightItem = nullptr;
MainListViewItem *oldHighlightItem = nullptr;
MainListViewItem *theSelectedItem = nullptr;
MainListViewItem *oldSelectedItem = nullptr;
Chapter3Option * option = new Chapter3Option();
signals:
public slots:
void updateSelectedIcon();
void onMainItemClick(QListWidgetItem *item);
};mainlistview.cpp
#include "mainlistview.h"
MainListView::MainListView(QWidget *parent) : QListWidget(parent)
{
setMouseTracking(true);
//連接信號(hào)與槽函數(shù),如果選中項(xiàng)發(fā)生變化則觸發(fā)item圖標(biāo)的更新.都是當(dāng)前對(duì)象發(fā)生
connect(this,&MainListView::itemSelectionChanged,this,&MainListView::updateSelectedIcon);
connect(this,&MainListView::itemClicked,this,&MainListView::onMainItemClick);
}
/**
* 處理鼠標(biāo)hove事件,item圖標(biāo)就變成hove狀態(tài)
* @brief MainListView::mouseMoveEvent
* @param event
*/
void MainListView::mouseMoveEvent(QMouseEvent *event){
oldHighlightItem = theHighlightItem;
theHighlightItem = static_cast<MainListViewItem *>(itemAt(event->pos()));
//舊的hover的item圖標(biāo)回復(fù)原狀(條件是該item沒(méi)有被選中)
//新的hover的iten圖標(biāo)變成hover狀態(tài)(條件是該item沒(méi)有被選中)
if(oldHighlightItem != theHighlightItem){
if(oldHighlightItem && !oldHighlightItem->isSelected()) oldHighlightItem->setIcon(oldHighlightItem->mIcon);
if(theHighlightItem && !theHighlightItem->isSelected()) theHighlightItem->setIcon(theHighlightItem->mIconHover);
}
}
/**
* 鼠標(biāo)按下(這個(gè)可以當(dāng)做item的點(diǎn)擊事件,能夠正常執(zhí)行)
* @brief MainListView::mousePressEvent
* @param event
*/
void MainListView::mousePressEvent(QMouseEvent *event){
if(event->buttons()&Qt::LeftButton){
startPoint = event->pos();
MainListViewItem *item = static_cast<MainListViewItem *>(itemAt(event->pos()));
QString filePath = QFileDialog::getOpenFileName(this, tr("選擇視頻"), "C:\\Users\\wei.yang\\Downloads\\opencv_res", tr("Image Files(*.jpg *.png)"));
const char *fileRealPath = filePath.toStdString().c_str();//將QString轉(zhuǎn)換為char*
qDebug() <<item->text()<<"--->"<<fileRealPath<<"--->pos:"<<item->mPos;
switch (item->mPos) {
case 1://顯示原圖
option->showSrcImage(fileRealPath);
break;
case 2://像素取反
option->pixleReverse(fileRealPath);
break;
case 3://圖像融合
option->imageFuse("","");
break;
case 4://調(diào)整圖像亮度及對(duì)比度
option->increaseBrightnessContrastRatio(fileRealPath);
break;
case 5://繪制線、矩形、橢圓、圓、多邊形、文本
option->drawShape();
break;
case 6://均值模糊:用于圖像的降噪
option->showBlur(fileRealPath);
break;
case 7://高斯模糊:用于圖像的降噪,其對(duì)自然界的噪聲有很好的抑制作用
option->showGaussianBlue(fileRealPath);
break;
case 8://中值濾波:終止濾波用于圖像的降噪,其對(duì)椒鹽噪聲有很好的抑制作用(黑白點(diǎn))
option->showMediaBlur(fileRealPath);
break;
case 9://雙邊濾波:其可以很好的保留邊緣的同時(shí)對(duì)平坦區(qū)域進(jìn)行降噪
option->showBilateralFilter(fileRealPath);
break;
case 10://提起圖像中的英文字母
option->showCleanImage(fileRealPath);
break;
case 11://形態(tài)學(xué)開(kāi)操作
option->showImageOpen(fileRealPath);
break;
case 12:// 形態(tài)學(xué)閉操作
option->showImageClose(fileRealPath);
break;
case 13://形態(tài)學(xué)梯度(基本梯度):膨脹減去腐蝕
option->showMorphologicalGradient(fileRealPath);
break;
case 14://頂帽操作:相當(dāng)于原圖像與開(kāi)操作之間的差值圖像
option->showTopHat(fileRealPath);
break;
case 15://黑帽操作:相當(dāng)于原圖像與閉操作之間的差值圖像
option->showBlackHat(fileRealPath);
break;
case 16://小案例:提取提取項(xiàng)目中的字母或者直線
option->showLines(fileRealPath,0);
break;
case 17://上采樣:利用拉普拉斯金字塔進(jìn)行圖像重建
option->showPyrUp(fileRealPath);
break;
case 18://降采樣:利用高斯金字塔進(jìn)行降采樣
option->showPyrDown(fileRealPath);
break;
case 19://高斯不同:把同一張圖片再不同的參數(shù)下做高斯模糊之后的結(jié)果相減,得到的輸出圖像稱(chēng)為高斯不同
option->showGaussianDiff(fileRealPath);
break;
case 20://使用自定義卷積核filter2D
option->showCustomKernelFilter2D(fileRealPath,1);
break;
case 21://1.合并rebort和sobel的x方向梯度和y方向的梯度
option->showCustomKernelFilter2DMergeXY(fileRealPath);
break;
case 22://填充圖像邊緣
option->showCopyMakeBorder(fileRealPath);
break;
case 23://使用Sobel和Scharr計(jì)算圖形梯度
option->showSobelAndScharr(fileRealPath);
break;
case 24://使用拉普拉斯算子顯示梯度圖像
option->showLaplacian(fileRealPath);
break;
case 25://邊緣檢測(cè)
option->showCanny(fileRealPath);
break;
}
}
}
/**
* 釋放鼠標(biāo)
* @brief MainListView::mouseReleaseEvent
* @param event
*/
void MainListView::mouseReleaseEvent(QMouseEvent *event){
//如果鼠標(biāo)釋放位置和單擊位置相距超過(guò)5像素,則不會(huì)觸發(fā)item選中
if((event->pos() - startPoint).manhattanLength() > 5) return;
MainListViewItem *item = static_cast<MainListViewItem *>(itemAt(event->pos()));
setCurrentItem(item);
}
/**
* 處理鼠標(biāo)離開(kāi)后,hover圖標(biāo)回復(fù)正常狀態(tài)
* @brief MainListView::leaveEvent
* @param event
*/
void MainListView::leaveEvent(QEvent *event){
Q_UNUSED(event);
oldHighlightItem = theHighlightItem;
if(oldHighlightItem && !oldHighlightItem->isSelected()) oldHighlightItem->setIcon(oldHighlightItem->mIcon);
oldHighlightItem = theHighlightItem = nullptr;
}
void MainListView::updateSelectedIcon(){
oldSelectedItem = theSelectedItem;
theSelectedItem = static_cast<MainListViewItem *>(currentItem());
//之前被選中的item圖標(biāo)回復(fù)原樣
//新被選中的item圖標(biāo)變成hover狀態(tài)
if(oldSelectedItem != theSelectedItem){
if(oldSelectedItem) oldSelectedItem->setIcon(oldSelectedItem->mIcon);
if(theSelectedItem) theSelectedItem->setIcon(theSelectedItem->mIconHover);
}
}
//這個(gè)槽函數(shù)并沒(méi)有執(zhí)行
void MainListView::onMainItemClick(QListWidgetItem *item){
qDebug() << "點(diǎn)擊了item的項(xiàng)目";
}2.自定義QListWidgetItem
mainlistviewitem.h
class MainListViewItem : public QListWidgetItem
{
//Q_OBJECT //由于QListWidgetItem沒(méi)有QObject屬性,所以Q_OBJECT需要注釋掉
public:
explicit MainListViewItem(QString itemTitle,const QIcon &icon, const QIcon &iconHover,int pos,QListWidget *parent = nullptr);
/**
* 設(shè)置item的圖標(biāo)
* @brief setItemIcon
* @param icon
* @param iconHover
*/
// void setItemIcon(const QIcon &icon,const QIcon &iconHover);
public:
QIcon mIcon;//默認(rèn)圖標(biāo)
QIcon mIconHover;//選中時(shí)圖標(biāo)
int mPos;//第一個(gè)編輯
signals:
};
mainlistviewitem.cpp
#include "mainlistviewitem.h"
/**
* 自定義主頁(yè)ListView的Item項(xiàng)
* @brief MainListViewItem::MainListViewItem
* @param parent
*/
MainListViewItem::MainListViewItem(QString itemTitle,const QIcon &icon, const QIcon &iconHover,int pos,QListWidget *parent) : QListWidgetItem(parent)
{
setText(itemTitle);
mIcon = icon;
mIconHover = iconHover;
setIcon(mIcon);
setSizeHint(QSize(360,47));
mPos = pos;
}
3.使用
void MainWindow::createListView(QWidget *parent){
listView = new MainListView(this);
listView->setFocusPolicy(Qt::NoFocus); //這樣可禁用tab鍵和上下方向鍵并且除去復(fù)選框
listView->setFixedHeight(320);
listView->setFont(QFont("宋體", 14, QFont::DemiBold));
listView->setFixedSize(QSize(360,480));
listView->move(0,menuBar()->height());
listView->setStyleSheet(
"{outline:0px;}" //除去復(fù)選框
"MainListViewItem{background:rgb(245, 245, 247); border:0px; margin:0px 0px 0px 0px;}"
"MainListViewItem::Item{height:40px; border:0px; padding-left: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); border-left:4px solid rgb(180, 0, 0);}"
"QListWidget::Item:selected:active{background:rgb(230, 231, 234); color:rgba(40, 40, 200, 255); border-left:4px solid rgb(180, 0, 0);}");
new MainListViewItem("顯示原圖",QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),1,listView);
new MainListViewItem(tr("像素取反"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),2,listView);
new MainListViewItem(tr("圖像融合"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),3,listView);
new MainListViewItem(tr("調(diào)整圖像亮度及對(duì)比度"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),4,listView);
new MainListViewItem(tr("繪制線、矩形、橢圓、圓、多邊形、文本"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),5,listView);
new MainListViewItem(tr("均值模糊"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),6,listView);
new MainListViewItem(tr("高斯模糊"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),7,listView);
new MainListViewItem(tr("中值濾波"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),8,listView);
new MainListViewItem(tr("雙邊濾波"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),9,listView);
new MainListViewItem(tr("提取圖像中的英文字母"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),10,listView);
new MainListViewItem(tr("形態(tài)學(xué)開(kāi)操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),11,listView);
new MainListViewItem(tr("形態(tài)學(xué)閉操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),12,listView);
new MainListViewItem(tr("形態(tài)學(xué)梯度(基本梯度)"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),13,listView);
new MainListViewItem(tr("頂帽操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),14,listView);
new MainListViewItem(tr("黑帽操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),15,listView);
new MainListViewItem(tr("小案例:提取提取項(xiàng)目中的字母或者直線"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),16,listView);
new MainListViewItem(tr("上采樣"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),17,listView);
new MainListViewItem(tr("降采樣"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),18,listView);
new MainListViewItem(tr("高斯不同"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),19,listView);
new MainListViewItem(tr("使用自定義卷積核filter2D"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),20,listView);
new MainListViewItem(tr("合并rebort及Sobel的x方向梯度和y方向的梯度"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),21,listView);
new MainListViewItem(tr("填充圖像邊緣"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),22,listView);
new MainListViewItem(tr("使用Sobel和Scharr計(jì)算圖形梯度"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),23,listView);
new MainListViewItem(tr("使用拉普拉斯算子顯示梯度圖像"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),24,listView);
new MainListViewItem(tr("邊緣檢測(cè)"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),25,listView);
// connect(listView,&MainListView::itemClicked,listView,&MainListView::onMainItemClick);
}
//最后一步:創(chuàng)建ListView,然后運(yùn)行就行了
createListView(this);
3、圖片演示

到此這篇關(guān)于QT實(shí)現(xiàn)制作一個(gè)ListView列表的示例代碼的文章就介紹到這了,更多相關(guān)QT制作ListView列表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中的移動(dòng)構(gòu)造函數(shù)及move語(yǔ)句示例詳解
這篇文章主要給大家介紹了關(guān)于C++中移動(dòng)構(gòu)造函數(shù)及move語(yǔ)句的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
C++日期類(lèi)計(jì)算器的模擬實(shí)現(xiàn)舉例詳解
兩個(gè)日期之間相隔天數(shù)的計(jì)算網(wǎng)上有許多的軟件,這里主要介紹如何使用C/C++語(yǔ)言來(lái)完成這樣的功能,下面這篇文章主要給大家介紹了關(guān)于C++日期類(lèi)計(jì)算器的模擬實(shí)現(xiàn),需要的朋友可以參考下2023-04-04
C++ stack與queue模擬實(shí)現(xiàn)詳解
這篇文章主要給大家介紹了關(guān)于c++stack與queue模擬實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)開(kāi)辟存儲(chǔ)楊輝三角
這篇文章主要介紹了如何利用C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)開(kāi)辟存儲(chǔ)楊輝三角,可以靈活的開(kāi)辟空間,充分的利用空間。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2022-03-03
C++程序內(nèi)存棧區(qū)與堆區(qū)模型案例分析
一直以來(lái)總是對(duì)這個(gè)問(wèn)題的認(rèn)識(shí)比較朦朧,我相信很多朋友也是這樣的,總是聽(tīng)到內(nèi)存一會(huì)在棧上分配,一會(huì)又在堆上分配,那么它們之間到底是怎么的區(qū)別呢,讓我們一起來(lái)看看2022-03-03
利用C語(yǔ)言實(shí)現(xiàn)三子棋(井字棋)小游戲
這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

