如何使用ListView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用ListView相关的知识,希望对你有一定的参考价值。

ListView控件的最基本用法是在窗体中以表格形式显示数据,是应用非常广泛的一个窗体控件。控件工具箱在初始状态下是没有ListView控
件的,需要我们在工具-附加控件中勾选"Microsoft ListView Control,Version
6.0",这样ListView控件就会显示在控件工具箱中了。ListView分为表头和数据两部分,而数据部分的第一列和其他列又是分开的,需要用不
同的方式来访问。假设我们在Sheet1中有一个5行4列的表格,现在我们看下怎样将这个表格中的数据导入到ListView控件中。
下面我们先来看怎样给ListView控件添加表头。有两种方法,先来看第一种

Private Sub UserForm_Initialize()
ListView1.ColumnHeaders.Add 1, "A", "姓名", ListView1.Width / 4, lvwColumnLeft '列数,key,text,宽度,对齐方式,图片
ListView1.ColumnHeaders.Add 2, "B", "性别", ListView1.Width / 4, lvwColumnCenter
ListView1.ColumnHeaders.Add 3, "C", "年龄", ListView1.Width / 4, lvwColumnCenter
ListView1.ColumnHeaders.Add 4, "D", "住址", ListView1.Width / 4, lvwColumnCenter
ListView1.View = lvwReport '显示方式
ListView1.FullRowSelect = False '是否整行选取
ListView1.Gridlines = True '是否显示表格线
End Sub

添加表头的第一种方法是用ColumnHeaders.Add的方法,该方法包括6个参数,比如上面第一行代码中1代表第一列,"A"是该列的一个
简称(不写也可以),“姓名”是要显示的文字,下一个参数是宽度,这里我们一共4列,所以第一列宽度设为控件宽度(ListView1.Width)的
1/4,第5个参数是对齐方式,其中第一列必须是左对齐的,其他列可以设置左右或居中对齐,第6个参数是图标索引,我们后面再讲,这里其中所有的参数都是
可省略的,一般写上显示的文字和宽度即可。ListView1.View是设置ListView控件的显示方式,一共四种,这里lvwReport是报表
形式显示,其他的我们后面再讲。FullRowSelect是指可否整行选取,Gridlines是否显示网格线,这些属性自己试下就知道了。

当然我们也可以用循环的方式来简化代码

Private Sub UserForm_Initialize()
Dim i
For i = 1 To 4
ListView1.ColumnHeaders.Add i, , Cells(1, i), ListView1.Width / 4
Next
ListView1.FullRowSelect = True
ListView1.View = lvwReport
ListView1.Gridlines = True
End Sub

对列加了个For循环而已,其实是完全相同的。

下面我们来看怎样向ListView控件中添加数据。两种方法,下面来看第一种

Private Sub CommandButton1_Click()
Dim itm As ListItem, i, List, li
ListView1.ListItems.Clear '清除数据
For i = 2 To 5
Set itm = ListView1.ListItems.Add '添加一个空行
itm.Text = Cells(i, 1) '添加第一列
itm.SubItems(1) = Cells(i, 2) '添加第二列
itm.SubItems(2) = Cells(i, 3)
itm.SubItems(3) = Cells(i, 4)
Next
End Sub

当然添加新数据之前要把原有数据先删除,用的是ListItems的Clear方法ListItem对象就是控件的行。先用ListItems的
Add方法添加一个空行,用变量itm来表示,下面就要向这个空行中添加数据,我们上面说过第一列和其他列的表示方法是不同的,第一列赋值要用Text,
之后各列用SubItems数组来赋值,第2列序号是1,第3列序号是2,依次类推。

下面来看添加数据的另一种方法,ListSubItems对象

' For i = 2 To 5
' Set List = ListView1.ListItems.Add(Text:=Cells(i, 1))
' Set li = List.ListSubItems.Add(Text:=Cells(i, 2)) 'subitems是个数组,Listsubitems是个对象集合
' Set li = List.ListSubItems.Add(Text:=Cells(i, 3))
' Set li = List.ListSubItems.Add(Text:=Cells(i, 4))
' Next

前面都一样,我只把For循环这段贴出来了,同样是用ListItems.Add新建一个空行,不同的是直接给其赋了一个值,这个值就是赋在第一列
的,之后又用List(刚添加的空行)的ListSubItems的Add方法,相当于在该行添加一个列,再赋值,有几列就添加用个
ListSubItems。ListSubItems和SubItems的区别在于前者是一个对象集合,既然是对象就有可以设置格式(可以和工作表的
Range对象类比),而后者仅仅是一个数组,因此也就不存在格式之类的属性了,所以如果需要给ListView控件改变格式就要用
ListSubItems对象。
参考技术A 软件开发中最常用的有ArrayAdapter<T>, BaseAdapter, SimpleAdapter,今天我用一段代码向大家诠释如何使用ListView控件。

教你如何使用QT制作一个ListView列表

这篇文章主要为大家详细介绍了如何使用Qt制作一个ListView,点击ListView的Item可以用于测试OpenCV的各种效果,感兴趣的小伙伴可以了解一下

1、概述

案例:使用Qt制作一个ListView。点击ListView的Item可以用于测试OpenCV的各种效果

自定义一个: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);
//连接信号与槽函数,如果选中项发生变化则触发item图标的更新.都是当前对象发生
connect(this,&MainListView::itemSelectionChanged,this,&MainListView::updateSelectedIcon);
connect(this,&MainListView::itemClicked,this,&MainListView::onMainItemClick);


/**
* 处理鼠标hove事件,item图标就变成hove状态
* @brief MainListView::mouseMoveEvent
* @param event
*/
void MainListView::mouseMoveEvent(QMouseEvent *event)
oldHighlightItem = theHighlightItem;
theHighlightItem = static_cast(itemAt(event->pos()));
//旧的hover的item图标回复原状(条件是该item没有被选中)
//新的hover的iten图标变成hover状态(条件是该item没有被选中)
if(oldHighlightItem != theHighlightItem)
if(oldHighlightItem && !oldHighlightItem->isSelected()) oldHighlightItem->setIcon(oldHighlightItem->mIcon);
if(theHighlightItem && !theHighlightItem->isSelected()) theHighlightItem->setIcon(theHighlightItem->mIconHover);



/**
* 鼠标按下(这个可以当做item的点击事件,能够正常执行)
* @brief MainListView::mousePressEvent
* @param event
*/
void MainListView::mousePressEvent(QMouseEvent *event)
if(event->buttons()&Qt::LeftButton)
startPoint = event->pos();
MainListViewItem *item = static_cast(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转换为char*
qDebug() <text()<<"--->"<pos:"<mPos;
switch (item->mPos)
case 1://显示原图
option->showSrcImage(fileRealPath);
break;
case 2://像素取反
option->pixleReverse(fileRealPath);
break;
case 3://图像融合
option->imageFuse("","");
break;
case 4://调整图像亮度及对比度
option->increaseBrightnessContrastRatio(fileRealPath);
break;
case 5://绘制线、矩形、椭圆、圆、多边形、文本
option->drawShape();
break;
case 6://均值模糊:用于图像的降噪
option->showBlur(fileRealPath);
break;
case 7://高斯模糊:用于图像的降噪,其对自然界的噪声有很好的抑制作用
option->showGaussianBlue(fileRealPath);
break;
case 8://中值滤波:终止滤波用于图像的降噪,其对椒盐噪声有很好的抑制作用(黑白点)
option->showMediaBlur(fileRealPath);
break;
case 9://双边滤波:其可以很好的保留边缘的同时对平坦区域进行降噪
option->showBilateralFilter(fileRealPath);
break;
case 10://提起图像中的英文字母
option->showCleanImage(fileRealPath);
break;
case 11://形态学开操作
option->showImageOpen(fileRealPath);
break;
case 12:// 形态学闭操作
option->showImageClose(fileRealPath);
break;
case 13://形态学梯度(基本梯度):膨胀减去腐蚀
option->showMorphologicalGradient(fileRealPath);
break;
case 14://顶帽操作:相当于原图像与开操作之间的差值图像
option->showTopHat(fileRealPath);
break;
case 15://黑帽操作:相当于原图像与闭操作之间的差值图像
option->showBlackHat(fileRealPath);
break;
case 16://小案例:提取提取项目中的字母或者直线
option->showLines(fileRealPath,0);
break;
case 17://上采样:利用拉普拉斯金字塔进行图像重建
option->showPyrUp(fileRealPath);
break;
case 18://降采样:利用高斯金字塔进行降采样
option->showPyrDown(fileRealPath);
break;
case 19://高斯不同:把同一张图片再不同的参数下做高斯模糊之后的结果相减,得到的输出图像称为高斯不同
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计算图形梯度
option->showSobelAndScharr(fileRealPath);
break;
case 24://使用拉普拉斯算子显示梯度图像
option->showLaplacian(fileRealPath);
break;
case 25://边缘检测
option->showCanny(fileRealPath);
break;




/**
* 释放鼠标
* @brief MainListView::mouseReleaseEvent
* @param event
*/
void MainListView::mouseReleaseEvent(QMouseEvent *event)
//如果鼠标释放位置和单击位置相距超过5像素,则不会触发item选中
if((event->pos() - startPoint).manhattanLength() > 5) return;
MainListViewItem *item = static_cast(itemAt(event->pos()));
setCurrentItem(item);


/**
* 处理鼠标离开后,hover图标回复正常状态
* @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(currentItem());

//之前被选中的item图标回复原样
//新被选中的item图标变成hover状态
if(oldSelectedItem != theSelectedItem)
if(oldSelectedItem) oldSelectedItem->setIcon(oldSelectedItem->mIcon);
if(theSelectedItem) theSelectedItem->setIcon(theSelectedItem->mIconHover);




//这个槽函数并没有执行
void MainListView::onMainItemClick(QListWidgetItem *item)
qDebug() << "点击了item的项目";

2.自定义QListWidgetItem

mainlistviewitem.h

class MainListViewItem : public QListWidgetItem

//Q_OBJECT //由于QListWidgetItem没有QObject属性,所以Q_OBJECT需要注释掉
public:
explicit MainListViewItem(QString itemTitle,const QIcon &icon, const QIcon &iconHover,int pos,QListWidget *parent = nullptr);
/**
* 设置item的图标
* @brief setItemIcon
* @param icon
* @param iconHover
*/
// void setItemIcon(const QIcon &icon,const QIcon &iconHover);
public:
QIcon mIcon;//默认图标
QIcon mIconHover;//选中时图标
int mPos;//第一个编辑

signals:

;

mainlistviewitem.cpp

#include "mainlistviewitem.h"

/**
* 自定义主页ListView的Item项
* @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键和上下方向键并且除去复选框
listView->setFixedHeight(320);
listView->setFont(QFont("宋体", 14, QFont::DemiBold));
listView->setFixedSize(QSize(360,480));
listView->move(0,menuBar()->height());
listView->setStyleSheet(
"outline:0px;" //除去复选框
"MainListViewItembackground:rgb(245, 245, 247); border:0px; margin:0px 0px 0px 0px;"
"MainListViewItem::Itemheight:40px; border:0px; padding-left:14px; color:rgba(200, 40, 40, 255);"
"MainListViewItem::Item:hovercolor:rgba(40, 40, 200, 255);"
"MainListViewItem::Item:selectedbackground:rgb(230, 231, 234); color:rgba(40, 40, 200, 255); border-left:4px solid rgb(180, 0, 0);"
"QListWidget::Item:selected:activebackground: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("调整图像亮度及对比度"),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("形态学开操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),11,listView);
new MainListViewItem(tr("形态学闭操作"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),12,listView);
new MainListViewItem(tr("形态学梯度(基本梯度)"),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("小案例:提取提取项目中的字母或者直线"),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计算图形梯度"),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("边缘检测"),QIcon(":res/icon_main_list.png"),QIcon(":res/icon_main_list.png"),25,listView);

// connect(listView,&MainListView::itemClicked,listView,&MainListView::onMainItemClick);

//最后一步:创建ListView,然后运行就行了
createListView(this);

3、图片演示

教你如何使用QT制作一个ListView列表_Qt

到此这篇关于QT实现制作一个ListView列表的示例代码的文章就介绍到这了


以上是关于如何使用ListView的主要内容,如果未能解决你的问题,请参考以下文章

WPF:如何在拖动 ListView 项目时允许在 ListView 中使用鼠标滚轮滚动?

如何使用 Listview 访问多个 JSONArray?

教你如何使用QT制作一个ListView列表

如何使用 onItemClickListener 存储 ListView 中的可点击项目?

如何在 ListView Widget 中使用 markdown 包(对于带有项目符号的文本)?在 ListView 中使用时没有显示

如何修复“所有单击的 Listview 项目都可以使用相同的数据”