model用于将数据与界面进行分离,Qt中的模型视图结构分为模型、视图和代理,其中,模型与数据源通信,并为其他部件提供接口。
model有很多种,这里以tree model为例:
Index用于索引model中的数据,相当于指针下标之类的效果
上图中,A项和C项作为model中顶层的兄弟项:
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());
A有许多孩子,它的一个孩子B用以下代码获取:
QModelIndex indexB = model->index(1, 0, indexA);
通过上面几行代码,可以知道最后一个参数的作用。
下面一段代码用于从txt文件中读取数据到model中
#include "mainwindow.h"
#include <QStandardItemModel>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QStringList>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
creatAction();
creatMenu();
setupModel();
setupView();
setWindowTitle(tr("View Example"));
resize(600,600);
}
MainWindow::~MainWindow()
{
}
void MainWindow::creatAction()
{
openAct=new QAction(tr("打开"),this);
connect(openAct,SIGNAL(triggered()),this,SLOT(slotOpen()));
}
void MainWindow ::creatMenu()
{
fileMenu=new QMenu("文件",this);
fileMenu->addAction(openAct);
menuBar()->addMenu(fileMenu);
}
void MainWindow::setupModel()
{
model=new QStandardItemModel(4,4,this);
model->setHeaderData(0,Qt::Horizontal,tr("部门"));
model->setHeaderData(1,Qt::Horizontal,tr("男"));
model->setHeaderData(2,Qt::Horizontal,tr("女"));
model->setHeaderData(3,Qt::Horizontal,tr("退休"));
}
void MainWindow::setupView()
{
table=new QTableView(this);
table->setModel(model);
QItemSelectionModel *selectionModel=new QItemSelectionModel(model);
table->setSelectionModel(selectionModel);
connect(selectionModel,SIGNAL(selectionChanged(QItemSelection,ItemSelection)),table,
SLOT(selectionChanged(QItemSelection,QItemSelection)));
// splitter= new QSplitter;
// splitter->setOrientation(Qt::Vertical);
// splitter->addWidget(table);
setCentralWidget(table);
}
void MainWindow::slotOpen()
{
QString name;
name=QFileDialog::getOpenFileName(this,"打开",".","histogram files(*.txt)");
if(!name.isEmpty())
openFlie(name);
}
void MainWindow::openFlie(QString path)
{
if(!path.isEmpty())
{
QFile file(path);
if(file.open(QFile::ReadOnly|QFile::Text))
{
QTextStream stream(&file);
QString line;
model->removeRows(0,model->rowCount(QModelIndex()),
QModelIndex());
int row=0;
do
{
line=stream.readLine();
if(!line.isEmpty())
{
model->insertRows(row,1,QModelIndex());
QStringList pieces=line.split(",",QString::SkipEmptyParts);
model->setData(model->index(row,0,QModelIndex()),pieces.value(0));
model->setData(model->index(row,1,QModelIndex()),pieces.value(1));
model->setData(model->index(row,2,QModelIndex()),pieces.value(2));
model->setData(model->index(row,3,QModelIndex()),pieces.value(3));
row++;
}
}while(!line.isEmpty());
file.close();
}
}
}
model->removeRows(0,model->rowCount(QModelIndex()),
QModelIndex());表示清除当前所有行和列
QString line;
line=stream.readLine();readline()函数可以每次可以读取一行,然后保存至Qstring中,每次读完后会自动+1,当读完后会返回null。
model->insertRows(row,1,QModelIndex());表示在第row行后面插入1行
model->setData(model->index(row,0,QModelIndex()),pieces.value(0));在model index第row行,第0列插入值
model->setData(model->index(row,1,QModelIndex()),pieces.value(1));
model->setData(model->index(row,2,QModelIndex()),pieces.value(2));
model->setData(model->index(row,3,QModelIndex()),pieces.value(3));同上
在这里model是表格型的,所以有row column,model相当于一个模型,可以将这个模型套到view上面,比如将table model套到Qtableview上面,需要注意的是,上面的操作都是在model里操作,没有在view里操作,在model里弄好之后再套到view里