Qt QListWidget项目知识点小结

前言

最近在研究视图模型,当然是根据网上的视频进行学习,现在把学习到的项目知识点都记录下来。

最终效果:
在这里插入图片描述

其中包括功能:

  1. 确定按钮:为列表项勾✔上后,点击确定按钮,会将勾✔上的列表项的文本显示出来;
  2. 清空按钮:清空textEdit文本框的文本;
  3. 添加按钮:在下方textEdit文本块输入文本后,点击添加按钮,会实现在最后插入一项;
  4. 删除按钮:选中某一项后进行删除;
  5. 获取文本按钮:获取选中列表项的所有文本,显示在文本块中;
  6. 修改文本按钮:将选中的列表项的文本修改为文本框中的文本;
  7. 右键菜单功能,右键插入的列表项是在选中的列表项后插入。

撸代码

ui界面

在这里插入图片描述


知识点汇总

新建列表项
QListWidgetItem *item = new QListWidgetItem;

设置文本
item->setText("字符串");

设置复选状态
item->setCheckState(Qt::Unchecked); // 设置为未选中状态

设置图标
item->setIcon(QIcon("图标路径"));

设置文本居中
item->setTextAlignment(Qt::AlignHCenter);

设置item项无法使用
item->setFlags(Qt::ItemIsSelectable);

设置item项的大小
item->setSizeHint(QSize(50, 50));

插入列表项
ui.listWidget->addItem(item);

将列表项插入到指定位置
ui.listWidget->insertItem(索引, item);

初始化时默认选中一行
ui.listWidget->setCurrentRow(0); // 默认选中第一项

设置显示模式
ui.listWidget->setViewMode(QListView::IconMode); //设置显示模式为图标模式
ui.listWidget->setViewMode(QListView::ListMode); //设置显示模式为列表模式

设置选择模式
// QAbstractItemView::ContiguousSelection 鼠标拖拉多选
// QAbstractItemView::ExtendedSelection: 按住ctrl多选
// QAbstractItemView::SingleSelection: 单选, 默认
// QAbstractItemView::MultiSelection:点击多选
ui.listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

设置样式,直接在函数中设置

ui.listWidget->setStyleSheet("QListWidget{border:1px solid gray; color:black; }"
							 "QListWidget::Item{padding-top:20px; padding-bottom:4px; }"
							 "QListWidget::Item:hover{background:skyblue; }"
							 "QListWidget::item:selected{background:lightgray; color:red; }"
							 "QListWidget::item:selected:!active{border-width:0px; background:lightgreen; }"

本人也不知道是什么意思,效果如图一。

获取列表项的个数
int row = ui.listWidget->count();

获取该列表项的复选框状态
ui.listWidget->item(i)->checkState() ;
可以使用if语句进行判断其是否勾上 Qt::Checked

取消列表项的复选框勾上状态
ui.listWidget->item(i)->setCheckState(Qt::CheckState::Unchecked);

获取列表项的文本
ui.listWidget->item(i)->text();

修改列表项的文本
item->setText("字符串");

获取所有选中的列表项
QList<QListWidgetItem *> items = ui.listWidget->selectedItems();

删除列表项

根据项删除:
ui.listWidget->removeItemWidget(item);
删除后记得释放列表项的内存: delete item;

根据索引删除:
ui.listWidget->takeItem(0);
记得也需要释放内存:delete ui.listWidget->item(0);


右键菜单

需添加头文件:#include <QMenu>

实例化菜单对象
m_Menu = new QMenu(this);

新建菜单项实体对象
QAction *action1 = new QAction("确定", this);

菜单项添加入菜单中
m_Menu->addAction(action1);

连接单击菜单信号与槽
connect(action1, SIGNAL(triggered()), this, SLOT(on_yesBtn_clicked()));
连接信号与槽后,当点击该菜单项后就会触发槽函数进行操作。

当然,得为其添加菜单事件函数

void contextMenuEvent(QContextMenuEvent *event);

// 鼠标右键显示菜单事件
void MyQListWidget::contextMenuEvent(QContextMenuEvent *event) {
	// 菜单出现的位置为当前鼠标的位置
	m_Menu->exec(QCursor::pos()); 
}

代码

.h文件

#pragma once

#include <QtWidgets/QWidget>
#include "ui_MyQListWidget.h"

#include <QMenu>

class MyQListWidget : public QWidget {
	Q_OBJECT

public:
	MyQListWidget(QWidget *parent = Q_NULLPTR);

	~MyQListWidget();

	// 右键显示菜单事件
	void contextMenuEvent(QContextMenuEvent * event);

private slots:
	void on_yesBtn_clicked();
	void on_noBtn_clicked();
	void on_addBtn_clicked();
	void on_deleteBtn_clicked();
	void on_gainBtn_clicked();
	void on_alterBtn_clicked();
	void addSignalItem();

private:
	Ui::MyQListWidgetClass ui;

	QMenu* m_Menu;
};

.cpp文件

#include "MyQListWidget.h"
#include <QListWidgetItem>
#include <QMessageBox>
#include <QDebug>


#pragma execution_character_set("utf-8") // qt支持显示中文

MyQListWidget::MyQListWidget(QWidget *parent) : QWidget(parent) {
	ui.setupUi(this);

	for (int i = 0; i <= 20; i++) {
		QString str = QString("item%1").arg(i);
		// 新列表建项
		QListWidgetItem *item = new QListWidgetItem;
		// 设置文本
		item->setText(str);
		// 设置复选状态
		item->setCheckState(Qt::Unchecked);
		// 设置图标
		item->setIcon(QIcon("E:\\QTproject\\WPS\\images\\wps.ico"));

		// 设置文本居中
		//item->setTextAlignment(Qt::AlignHCenter);

		// 设置item项无法使用
		//item->setFlags(Qt::ItemIsSelectable);

		// 设置item项的大小
		item->setSizeHint(QSize(50, 50));

		// 项添加到列表中
		ui.listWidget->addItem(item);	
		
	}


	// 初始化时默认选中一行
	ui.listWidget->setCurrentRow(0);

	/*设置显示模式*/
	//ui.listWidget->setViewMode(QListView::IconMode);   //设置显示模式为图标模式
	ui.listWidget->setViewMode(QListView::ListMode);   //设置显示模式为列表模式


	/*设置选择模式*/
	// QAbstractItemView::ContiguousSelection 鼠标拖拉多选
	// QAbstractItemView::ExtendedSelection: 按住ctrl多选
	// QAbstractItemView::SingleSelection: 单选, 默认
	// QAbstractItemView::MultiSelection:点击多选
	ui.listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);







	// 设置样式,直接在函数中设置
	ui.listWidget->setStyleSheet("QListWidget{border:1px solid gray; color:black; }"
							     "QListWidget::Item{padding-top:20px; padding-bottom:4px; }"
							     "QListWidget::Item:hover{background:skyblue; }"
								 "QListWidget::item:selected{background:lightgray; color:red; }"
								 "QListWidget::item:selected:!active{border-width:0px; background:lightgreen; }"
	);


	// 实例化菜单对象
	m_Menu = new QMenu(this);
	// 新建菜单项实体对象
	QAction *action1 = new QAction("确定", this);
	QAction *action2 = new QAction("清空", this);
	QAction *action3 = new QAction("添加", this);
	QAction *action4 = new QAction("删除", this);
	QAction *action5 = new QAction("获取文本", this);
	QAction *action6 = new QAction("修改文本", this);

	// 菜单项添加入菜单中
	m_Menu->addAction(action1);
	m_Menu->addAction(action2);
	m_Menu->addAction(action3);
	m_Menu->addAction(action4);
	m_Menu->addAction(action5);
	m_Menu->addAction(action6);

	// 连接单击菜单信号与槽
	connect(action1, SIGNAL(triggered()), this, SLOT(on_yesBtn_clicked()));
	connect(action2, SIGNAL(triggered()), this, SLOT(on_noBtn_clicked()));
	connect(action3, SIGNAL(triggered()), this, SLOT(addSignalItem()));
	connect(action4, SIGNAL(triggered()), this, SLOT(on_deleteBtn_clicked()));
	connect(action5, SIGNAL(triggered()), this, SLOT(on_gainBtn_clicked()));
	connect(action6, SIGNAL(triggered()), this, SLOT(on_alterBtn_clicked()));
}


MyQListWidget::~MyQListWidget() {
	// 获取所有菜单项
	QList<QAction*> list = m_Menu->actions();
	// 循环释放所有菜单项的内存
	for each(QAction* action in list) delete action;
	// 释放菜单对象内存
	delete m_Menu;

	// 获取所有的列表项
	QList<QListWidgetItem *> items = ui.listWidget->selectedItems();
	// 循环释放所有列表项的内存
	for each (QListWidgetItem *item in items) delete item;
	//delete ui.listWidget; 	// qt会自动释放
	//delete ...
}



// 确定按钮
void MyQListWidget::on_yesBtn_clicked() {
	int row = ui.listWidget->count();	// 获取个数
	QString str = "";

	for (int i = 0; i < row; i++) {
		// 获取打钩项的文本
		if (ui.listWidget->item(i)->checkState() == Qt::Checked) {
			str += ui.listWidget->item(i)->text() + "\n";
			// 取消打勾
			ui.listWidget->item(i)->setCheckState(Qt::CheckState::Unchecked);
		}
	}


	QMessageBox::information(this, "提示", str);
}


// 清空按钮
void MyQListWidget::on_noBtn_clicked() {
	// 文本框内容清空
	ui.textEdit->setPlainText("");
}


// 添加按钮
void MyQListWidget::on_addBtn_clicked() {
	// 合法检查
	if (ui.textEdit->toPlainText().isEmpty()) return;

	// 获取文本框中的文本
	QString str = ui.textEdit->toPlainText();
	// 将字符串以'\n'回车符进行分割(多项添加)
	QStringList list = str.split('\n');

	// 遍历字符串链表,并将字符串添加到列表中
	for each (QString text in list) {
		// 如果字符串为空则跳过添加
		if (text.isEmpty()) continue;

		// 检查不给插入相同文本的项
		bool flags = false;
		for (int i = 0; i < ui.listWidget->count(); i++) {
			// 使用字符串函数compare()比较两字符串是否相等
			if (ui.listWidget->item(i)->text().compare(text) == 0) {
				flags = true;
				break;
			}
		}
		if (flags) continue;
		

		// 新建项
		QListWidgetItem *item = new QListWidgetItem(text);
		item->setCheckState(Qt::CheckState::Unchecked);
		item->setIcon(QIcon("E:\\QTproject\\WPS\\images\\color.ico"));

		// 项添加到列表中
		ui.listWidget->addItem(item);
	}

	QMessageBox::information(this, "相同跳过", "添加成功!");

	// 文本框内容清空
	ui.textEdit->setText("");
}


// 删除按钮
void MyQListWidget::on_deleteBtn_clicked() {
	// 获取所有选中的项
	QList<QListWidgetItem *> items = ui.listWidget->selectedItems();
	// 遍历删除并释放资源
	for each (QListWidgetItem *item in items) {
		ui.listWidget->removeItemWidget(item);
		delete item;
	}

	ui.textEdit->setPlainText("");


	// 也可以根据索引来删除
	//ui.listWidget->takeItem(0);
	// 记得也需要释放内存
	//delete ui.listWidget->item(0);
}


// 获取文本按钮
void MyQListWidget::on_gainBtn_clicked() {
	QString str = "";
	// 获取所有选中的项
	QList<QListWidgetItem *> items = ui.listWidget->selectedItems();
	// 遍历获取文本
	for each (QListWidgetItem *item in items) {
		str += item->text() + '\n';
		qDebug() << item->text();
	}

	ui.textEdit->setText(str);
}



// 修改文本按钮
void MyQListWidget::on_alterBtn_clicked() {
	if (ui.textEdit->toPlainText().isEmpty()) return;

	// 只取用户输入的第一行文本作为修改
	QString alterText = ui.textEdit->toPlainText();
	QStringList list = alterText.split('\n');

	// 获取所有选中的项
	QList<QListWidgetItem *> items = ui.listWidget->selectedItems();
	// 遍历修改文本
	for each  (QListWidgetItem *item in items) {
		item->setText(list.at(0));
	}

	// 文本框内容清空
	ui.textEdit->setPlainText("");
}



// 鼠标右键显示菜单事件
void MyQListWidget::contextMenuEvent(QContextMenuEvent * event) {

	// 菜单出现的位置为当前鼠标的位置
	m_Menu->exec(QCursor::pos()); 
}



// 插入单个项,插入到指定位置
void MyQListWidget::addSignalItem() {
	// 合法检查
	if (ui.textEdit->toPlainText().isEmpty()) return;

	// 获取文本框中的文本
	QString str = ui.textEdit->toPlainText();
	// 将字符串以'\n'回车符进行分割(多项添加)
	QStringList list = str.split('\n');

	// 跳过添加相同文本的项
	for (int i = 0; i < ui.listWidget->count(); i++) {
		// 使用字符串函数compare()比较两字符串是否相等
		if (ui.listWidget->item(i)->text().compare(list.at(0)) == 0) {
			return;
		}
	}

	// 获取所有选中的项
	QList<QListWidgetItem *> items = ui.listWidget->selectedItems();
	// 获取选中项中的第一项的索引
	int index = ui.listWidget->row(items[0]);

	QListWidgetItem * item = new QListWidgetItem(list.at(0));
	item->setCheckState(Qt::CheckState::Unchecked);
	item->setIcon(QIcon("E:\\QTproject\\WPS\\images\\print.png"));
	// 将列表项插入到指定位置
	ui.listWidget->insertItem(index + 1, item);

	// 文本框内容清空
	ui.textEdit->setPlainText("");
}

总结:
QListWidget是QListView的子类,个人觉得效果没有QListView好,但是可以满足日常的操作。小项目中有许多相关知识点配合使用,还是挺有意思的。

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值