写点什么

Qt|ListWidget 控件总结

  • 2022 年 9 月 21 日
    河北
  • 本文字数:2181 字

    阅读完需:约 7 分钟

Qt|ListWidget控件总结

前提

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


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


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


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

功能

1:风格

QString strStyle = "QListWidget{font-size:14px; font-family:Microsoft YaHei UI;  " //字体大小,边框		"color:#333333; background:#FFFFFF;" //文本的字体颜色、背景色		"padding-left:10px;"		"border:1px solid #f6f8f9}"		/*列表项文本设置*/		"QListWidget::item{height:40px; }" //设置每行行高		/*列表项扫过时文本、背景变化*/		"QListWidget::item:hover{color:#333333; background:#FFB6C1;}"		/**列表项选中*/		"QListWidget::item::selected{ color:#4f7d8b; background:#edf2f3;}"		;
ui.listWidget->setStyleSheet(strStyle);
复制代码

2:插入文本

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

3:插入自定义控件

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

4:文本对齐方式

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

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

5:添加复选框

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

第一种:使用内部 API 实现

实现方式

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 消息进行处理

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 控件

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 基本使用已经总结完成了,一般项目中,也是只用到了这些而已,如果还有更为复杂的问题,可以留言告诉我哟~


我是中国好公民 st,一名 C++程序猿~

发布于: 2022 年 09 月 21 日阅读数: 22
用户头像

书山有路勤为径,学海无涯苦作舟 2022.07.01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
Qt|ListWidget控件总结_List_中国好公民st_InfoQ写作社区