前言
最近在研究视图模型,当然是根据网上的视频进行学习,现在把学习到的项目知识点都记录下来。
最终效果:
其中包括功能:
- 确定按钮:为列表项勾✔上后,点击确定按钮,会将勾✔上的列表项的文本显示出来;
- 清空按钮:清空textEdit文本框的文本;
- 添加按钮:在下方textEdit文本块输入文本后,点击添加按钮,会实现在最后插入一项;
- 删除按钮:选中某一项后进行删除;
- 获取文本按钮:获取选中列表项的所有文本,显示在文本块中;
- 修改文本按钮:将选中的列表项的文本修改为文本框中的文本;
- 右键菜单功能,右键插入的列表项是在选中的列表项后插入。
撸代码
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好,但是可以满足日常的操作。小项目中有许多相关知识点配合使用,还是挺有意思的。