Qt中ListWidget控件总结

前提

QListWidget类提供了一个基于项目的列表小部件。

QListWidget是一个方便的类,它提供了一个类似于QListView提供的列表视图,但是具有一个经典的基于项目的接口,用于添加和删除项目。QListWidget使用一个内部模型来管理列表中的每个QListWidgetItem。

对于更灵活的列表视图小部件,使用带有标准模型的QListView类。

那么对于该控件的功能该如何使用呢?

功能

1:风格

cpp 复制代码
QString qsStyle = "QListWidget{color:#333333; background:#f6f9fe; border:0px;}"
		/*列表项扫过时文本、背景变化*/
		"QListWidget::item:hover{color:#333333; background:#f6f9fe;}"
		/**列表项选中*/
		"QListWidget::item::selected{color:#333333; background:#f6f9fe;}";

2:插入文本

cpp 复制代码
//插入一条数据
QString qsContent = QStringLiteral("插入一条数据内容");
QListWidgetItem *item = new QListWidgetItem;
item->setText(qsContent);
ui.listWidget->addItem(item);

3:插入自定义控件

假设,有一个QCustomWidget自定义widget需要放入QListWidget控件中,该如何使用呢?

cpp 复制代码
QListWidgetItem *item = new QListWidgetItem;
//创建自定义widget
QCustomWidget *customWidget = new QCustomWidget(this);
/*当前自定义控件的功能设置,这里不一一展示,每个人的要求不一样*/
customWidget->show(); //必须要写show哟~
//将自定义widget插入到列表中
ui.listWidget->addItem(item);
ui.listWidget->setItemWidget(item, customWidget);

问:假设需要点击每个自定义的widget时,响应消息做不同的处理,那么该如何操作呢?

答:我们每往QlistWidget中插入一条自定义信息时,必须要对插入的指针做消息处理

cpp 复制代码
QCustomWidget *customWidget = new QCustomWidget(this);
/*当前自定义控件的功能设置,这里不一一展示,每个人的要求不一样*/
connect(cutomWidget, &QCustomWidget::Msg_SendCustomInfor, this, &QMyWidget::MsgReceivedCustomInfor);
customWidget->show(); //必须要写show哟~

这种方式就会实现每点击一个自定义的item就会触发不同的槽函数。

问:每次插入的自定义widget都响应同一个消息,能分清楚是哪个new出来的widget的触发的吗?

答:这个问题我再刚开始使用的时候也出现过这种情况,那么我们该如何分清楚不同对象触发同一个响应函数呢?

我们在将自定义widget插入到QListWidget中时,需要用一个容器存储创建的自定义指针

cpp 复制代码
std::vector<QCustomWidget*> m_vetWidet;

每在QListWidget中存储一条数据时,就需要在容器中存储new出来的内容

虽然每个QCustomWidget的响应函数都触发:MsgReceivedCustomInfor

但是我们可以在该函数中获取当前正在触发的类指针,怎么样的写法呢?

cpp 复制代码
QCustomWidget* widget = qobject_case<QCustomWidget*>(sender());

当前widget就是当前触发的类指针,我们可以在存储的vector中匹配出对应的类指针,做实际操作。

4:文本对齐方式

该方式只适用于插入文本操作

cpp 复制代码
QString qsContent = QStringLiteral("插入一条数据内容");
QListWidgetItem *item = new QListWidgetItem;
item->setText(qsContent);
/*以下是重点!!!*/
item->setTextAlignment(Qt::AlignLeft|Qt::AlignVenter);
ui.listWidget->addItem(item);

5:添加复选框

在QListWidget控件中有两种添加复选框的方式

第一种:使用内部API实现

实现方式

cpp 复制代码
QString qsContent = QStringLiteral("插入一条数据内容");
QListWidgetItem *item = new QListWidgetItem;
item->setText(qsContent);
item->setTextAlignment(Qt::AlignLeft|Qt::AlignVenter);
/*以下是重点!!!*/
item->setCheckState(Qt::Unchecked); //设置未选中状态
ui.listWidget->addItem(item);

其中,主要的方法是:setCheckState

问:那么,如何获取选中的效果呢?

答:使用QListWidget::itemPressed消息进行处理

cpp 复制代码
void QLearnListWidget::OnListWidgetItemChanged(QListWidgetItem *item)
{
	//获取当前item的状态
	Qt::CheckState state = item->checkState();
	if (state == Qt::Unchecked)
	{
		//未被选中
		item->setCheckState(Qt::Checked);
	}
	else if (state == Qt::Checked)
	{
		//选中后取消选中
		item->setCheckState(Qt::Unchecked);
	}
}

优点:快捷方便获取

缺点:无法对内部的QCheckBox进行风格设置

第二种:嵌入QCheckBox控件
cpp 复制代码
QString qsContent = QStringLiteral("插入一条数据内容");
QListWidgetItem *item = new QListWidgetItem;
QCheckBox *check = new QCheckBox(qsContent, ui.listWidget);
check->show();
ui.listWidget->addItem(item);
ui.listWidget->setItemWidget(item, check);

上述代码中,需要注意的是:必须先进行addItem,再setItemWidget。否则无法显示文本内容。

优点:可以任意修改checkbox的风格。

缺点:当点击到空白区域时,无法响应QListWidget的消息。因为该条目内被QCheckBox包围,只能对QCheckBox消息处理。

总结

到这里对于QListWidget基本使用已经总结完成了,一般项目中,也是只用到了这些而已,如果还有更为复杂的问题,可以留言告诉我哟~

我是糯诺诺米团,一名C++开发程序媛~

相关推荐
倔强的石头1064 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
Watermelo6179 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
半盏茶香1 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J2 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB2 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3052 小时前
11.vector的介绍及模拟实现
开发语言·c++
计算机学长大白3 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
PieroPc4 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439697 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna7 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos