stringlistmodel 字符串列表映射组件,该组件用于处理字符串与列表框组件中数据的转换,通常该组件会配合listview组件一起使用,例如将listview组件与model模型绑定,当listview组件内有数据更新时,我们就可以利用映射将数据模型中的数值以字符串格式提取出来,同理也可实现将字符串赋值到指定的listview组件内。
首先在ui界面中排版
默认的mainwindow::mainwindow
构造函数中,我们首先初始化一个qstringlist
字符串链表并对该链表赋值,通过new qstringlistmodel(this);
创建一个数据模型,并通过ui->listview->setmodel(model);
属性将模型与listview组件绑定,当listview组件被选中是则触发on_listview_clicked
事件实现输出当前选中行,其初始化代码部分如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qstringlist>
#include <qstringlistmodel>
mainwindow::mainwindow(qwidget *parent): qmainwindow(parent), ui(new ui::mainwindow)
{
ui->setupui(this);
// 初始化一个stringlist字符串列表
qstringlist thestringlist;
thestringlist << "北京" << "上海" << "广州";
// 创建并使用数据模型
model = new qstringlistmodel(this); // 创建模型
model->setstringlist(thestringlist); // 导入模型数据
ui->listview->setmodel(model); // 为listview设置模型
ui->listview->setedittriggers(qabstractitemview::doubleclicked |
qabstractitemview::selectedclicked);
}
mainwindow::~mainwindow()
{
delete ui;
}
// 当listview列表项被选中时,显示qmodelindex的行、列号
void mainwindow::on_listview_clicked(const qmodelindex &index)
{
ui->labinfo->settext(qstring::asprintf("当前项:row=%d, column=%d",
index.row(),index.column()));
}
代码运行效果:
添加代码:需要通过model->index()
获取到最后一行的索引,然后使用model->setdata()
追加写入数据到最后一条索引位置。
插入代码: 需要通过ui->listview->currentindex()
获取到当前光标位置,并调用model->setdata()
插入到指定位置。
删除代码: 直接调用model->removerows()
等函数即可将指定位置删除。
// 添加一行
void mainwindow::on_btnlistappend_clicked()
{
model->insertrow(model->rowcount()); // 在尾部插入一行
qmodelindex index = model->index(model->rowcount()-1,0); // 获取最后一行的索引
qstring linetext = ui->lineedit->text();
model->setdata(index,linetext,qt::displayrole); // 设置显示文字
ui->listview->setcurrentindex(index); // 设置当前行选中
ui->lineedit->clear();
}
// 插入一行数据到listview
void mainwindow::on_btnlistinsert_clicked()
{
qmodelindex index;
index= ui->listview->currentindex(); // 获取当前选中行
model->insertrow(index.row()); // 在当前行的前面插入一行
qstring linetext = ui->lineedit->text();
model->setdata(index,linetext,qt::displayrole); // 设置显示文字
model->setdata(index,qt::alignright,qt::textalignmentrole); // 设置对其方式
ui->listview->setcurrentindex(index); // 设置当前选中行
}
// 删除当前选中行
void mainwindow::on_btnlistdelete_clicked()
{
qmodelindex index;
index = ui->listview->currentindex(); // 获取当前行的modelindex
model->removerow(index.row()); // 删除选中行
}
// 清除当前列表
void mainwindow::on_btnlistclear_clicked()
{
model->removerows(0,model->rowcount());
}
代码运行效果:
如果需要实现将listview
数据模型中的数据导出到plaintextedit
组件中,则需要通过model->stringlist()
获取到listview中的每行并将其赋值到qstringlist
字符串链表中,最后通过循环的方式依次插入到plaintextedit
中即可,插入时默认会以逗号作为分隔符。
// 显示数据模型文本到qplaintextedit
void mainwindow::on_btntextimport_clicked()
{
qstringlist plist;
plist = model->stringlist(); // 获取数据模型的stringlist
ui->plaintextedit->clear(); // 先清空文本框
// 循环追加数据
for(int x=0;x< plist.count();x++)
{
ui->plaintextedit->appendplaintext(plist.at(x) + qstring(","));
}
}
代码运行效果: