上一篇文章《Qt的MVC模型/视图编程(二)——标准模型的简单应用》讲了标准模型QStandardItemModel类的简单应用;这一篇文章将会讲解标准模型QStandardItemModel类的复杂应用,通过讲解实际的一个小例子程序,达到掌握标准模型QStandardItemModel类的复杂应用的效果;可以直接被借鉴到实际工程中;
这个例子的运行后的图片如下图所示:
这个例子程序的功能是:通过把txt文档中的数据读出来后显示到视图中,当点击视图中的某一行时,会把数据显示到右边的编辑框中;如果是录入新数据,则是在右边的编辑中输入然后点击save按钮把数据保存到txt文档,同时更新到视图中;
这个例子程序实现的过程是:当点击“refresh”时,把数据从txt文档中解析出数据,将解析后的数据存入到QStandardItem对象中;然后别存入到表格视图的Model和数据映射窗口器的Model中;在QStandardItemModel对象中组织显示数据项,QStandardItemModel对象就会把数据显示到视图中;这个过程的流程如下所示:
当点击“save”时,就获取编辑框的数据,把数据存入txt文档和存入到表格视图的Model和数据映射窗口器的Model中;当点击表格中的某一行时,就显示数据映射窗口器的Model中某一个行既可;
这个例子程序的核心类图如下所示:
这个例子的核心代码如下所示:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化数据窗口映射器
m_mapperSampleInfo = new CDataWidgetMapper(this);
m_mapperSampleInfo->addMapping(ui->leID,0);
m_mapperSampleInfo->addMapping(ui->leName,1 );
m_mapperSampleInfo->addMapping(ui->leScore,2 );
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnRefresh_clicked()
{
ui->tbView->Clear();
QVector<QVariant> vecViewData;
QList<ScoreInfo> listScoreInfo = GetDataMgr.GetData();
if(!listScoreInfo.isEmpty())
{
for(int i =0 ;i < listScoreInfo.size();i++)
{
vecViewData.clear();
vecViewData<<listScoreInfo[i].id()
<<listScoreInfo[i].name()
<<listScoreInfo[i].score();
ui->tbView->addViewData(vecViewData);
m_mapperSampleInfo->AddMapperData(vecViewData);
}
}
else
{
QMessageBox::critical(this, "Error", "Data source read error!", QMessageBox::Ok);
}
}
void MainWindow::on_btnSave_clicked()
{
if(ui->leID->text().isEmpty() ||ui->leName->text().isEmpty()
|| ui->leScore->text().isEmpty() )
{
QMessageBox::critical(this, "Error", "please input data!", QMessageBox::Ok);
}
else
{
ScoreInfo cScoreInfo( ui->leID->text() ,ui->leName->text(),ui->leScore->text().toInt());
QVector<QVariant> vecViewData;
vecViewData<<cScoreInfo.id()<<cScoreInfo.name()<<cScoreInfo.score();
ui->tbView->addViewData(vecViewData);
GetDataMgr.SaveData(cScoreInfo);
m_mapperSampleInfo->AddMapperData(vecViewData);
}
}
void MainWindow::on_tbView_clicked(const QModelIndex &index)
{
m_mapperSampleInfo->setCurrentIndex(index.row());
}
void MainWindow::on_tbView_entered(const QModelIndex &index)
{
m_mapperSampleInfo->setCurrentIndex(index.row());
}
完整的例子程序在下面的链接中: