C/C++中使用列表框组件Qt ListWidget
listwidget列表框组件,该组件与treewidget有些相似,区别在于treewidget可以实现嵌套以及多字段结构,而listwidget组件则只能实现单字段结构,listwidget组件常用于显示单条记录,例如只显示ip地址,用户名等数据,如下笔记是本人在开发中经常用到的一些基本操作技巧,包括列表框组件的基本操作方法。
常用节点间的操作方法如下:
- listview 组件与应用基础
- listwidget 初始化
- listwidget 变化行(触发事件)
- listwidget 编辑状态设置
- listwidget 全选/全不选
- listwidget 反选(对错交织)
- listwidget 指定位置插入 / 增加一项
- listwidget 删除选中项
listview 组件与应用基础:
该组件与listwidget功能一致,只是listview无法实现编辑只能预览。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <qlistview> #include <qstandarditem> #include <qstringlistmodel> mainwindow::mainwindow(qwidget *parent) :qmainwindow(parent),ui(new ui::mainwindow) { ui->setupui(this); } mainwindow::~mainwindow() { delete ui; } // 初始化view组件 向listview组件中填充数据 // by:lyshark // https://www.cnblogs.com/lyshark void mainwindow::on_pushbutton_clicked() { qstringlist data; qstringlistmodel *model; // 追加数据到listview中 data << qstring("192.168.1.1"); data << qstring("192.168.1.2"); data << qstring("192.168.1.3"); data << qstring("192.168.1.4"); model = new qstringlistmodel(data); ui->listview->setmodel(model); // 移除第1个地址 data.removeat(0); // 再次刷新listview model = new qstringlistmodel(data); ui->listview->setmodel(model); } // 实现间隔初始化,每一行一种颜色 void mainwindow::on_pushbutton_2_clicked() { qstringlist data; qstandarditemmodel *model = new qstandarditemmodel(); // 清空记录 model->removerows(0,model->rowcount()); // 追加数据到listview中 data << qstring("192.168.1.1"); // 循环追加 for(int x=2; x<5; x++) { data << qstring("192.168.1.%0").arg(x); } // 输出到listview记录 int ncount = data.size(); for(int x=0; x<ncount; x++) { qstring string = static_cast<qstring>(data.at((x))); // 强转为qstring类型 qstandarditem *item = new qstandarditem(string); if(x%2 == 0) { // 设置色彩 qlineargradient linear_grad(qpointf(0,0),qpointf(200,200)); linear_grad.setcolorat(0,qt::darkgreen); qbrush brush(linear_grad); item->setbackground(brush); } // 追加到mode模型 model->appendrow(item); } // 设置模型 ui->listview->setmodel(model); //ui->listview->setfixedsize(200,300); }
代码运行效果如下:
上方代码中我们多数都是在使用view视图组件,接下来将具体分析widget组件的使用细节,view组件与widget组件看似一致,但却存在本质区别,其大致区别如下:
- widget 组件可以直接通过如additem等一系列函数操作特定数据集,该组件还具有直接编辑的能力。
- view 组件是基于model模型映射工作的,每次操作数据时都需要借助qabstractlistmodel数据模型来操作。
简单来说view组件适合于浏览展示数据较多的场景,因为其绑定了链表结构从而在数据的展示上更为灵活,而widget组件更适合于更新或修改数据较多的使用场景。
listwidget 节点初始化:
节点的初始化就是向widget组件内插入一个qlistwidgetitem类。
// 初始化列表 listwidget // by: lyshark void mainwindow::on_pushbutton_clicked() { // 每一行是一个qlistwidgetitem qlistwidgetitem *aitem; // 设置icon的图标 qicon aicon; aicon.addfile(":/image/1.ico"); ui->listwidget->clear(); for(int x=0;x<10;x++) { qstring str = qstring::asprintf("192.168.1.%d",x); aitem = new qlistwidgetitem(); // 新建一个项 aitem->settext(str); // 设置文字标签 aitem->seticon(aicon); // 设置图标 aitem->setcheckstate(qt::checked); // 设为选中状态 aitem->setflags(qt::itemisselectable | // 设置为不可编辑状态 qt::itemisusercheckable |qt::itemisenabled); ui->listwidget->additem(aitem); //增加项 } }
代码运行效果如下:
listwidget 行内文本变化:
当我们点击行内任意一个列表选项时,我们让其触发currentitemchanged并将变化行更新到窗体上。
// listwidget 当前选中项发生变化 // by: lyshark void mainwindow::on_listwidget_currentitemchanged(qlistwidgetitem *current, qlistwidgetitem *previous) { qstring str; if (current != null) //需要检测变量指针是否为空 { if (previous==null) //需要检测变量指针是否为空 { str="当前:"+current->text(); this->setwindowtitle(qstring(current->text())); } else { str="前一项:" + previous->text() + "; 当前项:" + current->text(); std::cout << str.tostdstring().data() << std::endl; this->setwindowtitle(qstring(current->text())); } } }
代码运行效果如下:
listwidget 编辑状态设置:
默认情况下listwidget组件内所有文件是不可编辑的,我们也可以将编辑属性打开。
// 设置所有项设置为可编辑状态 // https://www.cnblogs.com/lyshark void mainwindow::on_pushbutton_5_clicked() { int x,cnt; qlistwidgetitem *aitem; cnt = ui->listwidget->count(); for(x=0;x<cnt;x++) { aitem = ui->listwidget->item(x); aitem->setflags(qt::itemisselectable | qt::itemiseditable |qt::itemisusercheckable |qt::itemisenabled); } }
代码运行效果如下:
listwidget 全选/全不选:
全选顾名思义就是选中菜单中的所有数据,使用aitem->setcheckstate(qt::checked)实现选中,通过循环计数即可。
// 全选按钮 // https://www.cnblogs.com/lyshark void mainwindow::on_pushbutton_2_clicked() { int cnt = ui->listwidget->count(); // 获取总数 for(int x=0;x<cnt;x++) { qlistwidgetitem *aitem = ui->listwidget->item(x); // 获取到一项指针 aitem->setcheckstate(qt::checked); // 设置为选中 } } // 全不选 // by: lyshark void mainwindow::on_pushbutton_3_clicked() { int cnt = ui->listwidget->count(); // 获取总数 for(int x=0;x<cnt;x++) { qlistwidgetitem *aitem = ui->listwidget->item(x); // 获取到一项指针 aitem->setcheckstate(qt::unchecked); // 设置为非选中 } }
代码运行效果如下:
listwidget 反选功能:
反选的含义是,用户选中菜单反选后会变为未选中状态,未选中则变为选中,只需要增加一个判断即可实现。
// by: lyshark void mainwindow::on_pushbutton_4_clicked() { int x,cnt; qlistwidgetitem *aitem; cnt = ui->listwidget->count(); for(x=0;x<cnt;x++) { aitem = ui->listwidget->item(x); if(aitem->checkstate() != qt::checked) aitem->setcheckstate(qt::checked); else aitem->setcheckstate(qt::unchecked); } }
代码运行效果如下:
listwidget 指定位置插入/追加插入:
在选中行的上方插入一行新的表项,以及追加到末尾一行。
// 指定位置插入一项 // www.cnblogs.com/lyshark void mainwindow::on_pushbutton_8_clicked() { qicon aicon; aicon.addfile(":/image/3.ico"); qlistwidgetitem *aitem = new qlistwidgetitem("插入的数据"); aitem->seticon(aicon); aitem->setcheckstate(qt::checked); aitem->setflags(qt::itemisselectable |qt::itemisusercheckable |qt::itemisenabled); // 在当前行的上方插入一个项 ui->listwidget->insertitem(ui->listwidget->currentrow(),aitem); } // 增加一项,尾部追加 void mainwindow::on_pushbutton_7_clicked() { qicon aicon; aicon.addfile(":/image/2.ico"); qlistwidgetitem *aitem = new qlistwidgetitem("新增的项目"); // 增加项目名 aitem->seticon(aicon); // 设置图标 aitem->setcheckstate(qt::checked); // 设置为选中 aitem->setflags(qt::itemisselectable |qt::itemisusercheckable |qt::itemisenabled); ui->listwidget->additem(aitem); // 增加到控件 }
代码运行效果如下:
listwidget 删除选中项:
删除当前选中的一项,并清理释放内存。
// 删除选中项 void mainwindow::on_pushbutton_6_clicked() { int row = ui->listwidget->currentrow(); // 获取当前行 qlistwidgetitem *aitem = ui->listwidget->takeitem(row); // 移除指定行的项,但不delete delete aitem; // 释放空间 }
代码运行效果如下:
文章出处:https://www.cnblogs.com/lyshark
到此这篇关于c/c++中使用列表框组件qt listwidget的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。