目录
Qt 16: 模型/视图简介和使用 (Model/View Programming)
Qt 17:模型/视图编程实例 (Model/View Programming)
Qt 16: 模型/视图简介和使用 (Model/View Programming)
优点:
1、在处理较大的数据集时,每个组件各司其职,不至于降低性能。
2、一个Model 可以映射到多个View,这样可以以不同的方式查看数据,同一份数据。
3、如果底层数据源的存储改变了,我们只需要处理Model 就可以了。
模型的基类:
The QAbstractItemModel class provides the abstract interface for item model classes.
Inherited By:
QAbstractListModel, QAbstractProxyModel, QAbstractTableModel。
视图的基类:
The QAbstractItemView class provides the basic functionality for item view classes.
Inherited By:
QColumnView, QHeaderView, QListView, QTableView, and QTreeView。
//model_view1的mian.cpp代码文件
//model_view1的mian.cpp代码文件
#include "model_view1.h"
#include <QApplication>
#include <QSplitter> //分隔器
#include <QTreeView>
#include <QListView>
#include <QFileSystemModel>
#include <QDir>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//Model_View1 w;
//w.show();
//新创建一个分隔器。
QSplitter *splitter_01 = new QSplitter;
//新创建一个文件系统的模型,设置模型的路径,即加载数据到模型中。
QFileSystemModel *model_01 = new QFileSystemModel;
model_01->setRootPath(QDir::currentPath());
{
//新创建一个树形视图,其父节点为分隔器splitter_01,再将模型model_01加载绑定到树形视图中。
QTreeView *treeview_01 = new QTreeView(splitter_01);
treeview_01->setModel(model_01);
//设置路径索引,显示当前路径。
treeview_01->setRootIndex(model_01->index(QDir::currentPath()));
}
{
//新创建一个列表视图,其父节点为分隔器splitter_01,再将模型model_01加载绑定到列表视图中。
QListView *listview_01 = new QListView(splitter_01);
listview_01->setModel(model_01);
listview_01->setRootIndex(model_01->index(QDir::currentPath()));
}
splitter_01->show();
return a.exec();
}
Qt 17:模型/视图编程实例 (Model/View Programming)
//ModelView01.cpp代码文件
//ModelView01.cpp代码文件
#include "model_view1.h"
#include "ui_model_view1.h"
#include <QAbstractItemView>
Model_View1::Model_View1(QWidget *parent): QWidget(parent), ui(new Ui::Model_View1)
{
ui->setupUi(this);
m_pModel = new QStandardItemModel(7,4);//设置模型为7行,4列。
//设置列标题
m_pModel->setHorizontalHeaderLabels(QStringList()<<"X"<<"W"<<"Y"<<"37");
//将两个视图绑定到模型中。
ui->tableView_01->setModel(m_pModel);
ui->tableView_01->setAlternatingRowColors(true);//设置隔行变色。
ui->tableView_01->setMinimumWidth(300);//设置视图的最小宽度。
ui->tableView_01->setMinimumHeight(260);//设置视图的最小高度。
ui->tableView_01->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置界面可以拉伸。
ui->tableView_01->horizontalHeader()->setStretchLastSection(true);//设置最后一页贴边。
ui->tableView_02->setModel(m_pModel);
ui->tableView_02->setMinimumWidth(300);
ui->tableView_02->setMinimumHeight(260);
ui->tableView_02->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置界面可以拉伸。
ui->tableView_02->horizontalHeader()->setStretchLastSection(true);//设置最后一页贴边。
//绑定删除按钮函数
connect(ui->Button_Clear_01,&QPushButton::clicked,this,&Model_View1::onButton_Clear_01);
show(); //showMaximized();
}
Model_View1::~Model_View1()
{
delete ui;
}
//清除按钮的函数,清除模型的数据,不是直接操作视图。
void Model_View1::onButton_Clear_01()
{
int rowCount = m_pModel->rowCount(); //获取目前的行数,即全部的行数。
//删除所有行,再重新插入。
for(int row_01=rowCount; 0<=row_01; --row_01)
{
m_pModel->removeRow(row_01);//从最后一行删除。
}
for(int row_01=0; row_01<rowCount; ++row_01)
{
m_pModel->insertRow(row_01);
}
}
//ModelView01.h代码文件
//ModelView01.h代码文件
#ifndef MODEL_VIEW1_H
#define MODEL_VIEW1_H
#include <QWidget>
#include <QStandardItemModel> //模型
QT_BEGIN_NAMESPACE
namespace Ui { class Model_View1; }
QT_END_NAMESPACE
class Model_View1 : public QWidget
{
Q_OBJECT
public:
Model_View1(QWidget *parent = nullptr);
~Model_View1();
private slots:
void onButton_Clear_01();
private:
Ui::Model_View1 *ui;
QStandardItemModel *m_pModel;
};
#endif // MODEL_VIEW1_H
Qt 18 : 模型视图编程实例
//listviewmodel.cpp代码文件
//listviewmodel.cpp代码文件
#include "listviewmodel_1.h"
#include "ui_listviewmodel_1.h"
#include <QStandardItem>
#include <QMessageBox>
listviewmodel_1::listviewmodel_1(QWidget *parent): QWidget(parent), ui(new Ui::listviewmodel_1)
{
ui->setupUi(this);
init_model();
//相当于初始化视图显示的模型。
ui->listView_01->setModel(m_Student_model);
}
listviewmodel_1::~listviewmodel_1()
{
delete ui;
}
void listviewmodel_1::on_pushButton_ok_clicked()
{
//获取当前复合视图的文本。
QString currentModel = ui->comboBox_01->currentText();
QString checkedStr;//显示选择的文本字符串。
if(currentModel.contains("学生"))
{
for(int i=0; i < m_Student_model->rowCount();i++)
{
//如果模型的项目的状态为选择的状态,就将器文本添加到字符串中。
if(m_Student_model->item(i,0)->checkState()== Qt::Checked)
{
checkedStr += m_Student_model->item(i,0)->text() + "\n";
}
}
}
if(currentModel.contains("老师"))
{
for(int i=0; i<m_Teacher_model->rowCount();i++)
{
if(m_Teacher_model->item(i,0)->checkState()== Qt::Checked)
{
checkedStr += m_Teacher_model->item(i,0)->text() + "\n";
}
}
}
if(currentModel.contains("工人"))
{
for(int i=0; i<m_Worker_model->rowCount();i++)
{
if(m_Worker_model->item(i,0)->checkState()== Qt::Checked)
{
checkedStr += m_Worker_model->item(i,0)->text() + "\n";
}
}
}
//定义一个对话框,并设置标准按钮。
QMessageBox megBox_01;
megBox_01.setStandardButtons(QMessageBox::Yes|QMessageBox::No);
megBox_01.setText("当前模型:"+currentModel);//设置标题文本。
megBox_01.setInformativeText(checkedStr);//设置内容文本。
if(megBox_01.exec() == QMessageBox::Accepted) //QMessageBox::No
{
close();
}
}
void listviewmodel_1::on_pushButton_no_clicked()
{
close();
}
void listviewmodel_1::init_model()
{
m_Student_model = new QStandardItemModel(0,1);
for(int i=0;i<10;i++)
{
QStandardItem *item= new QStandardItem(QString("学生:%1").arg(i));
item->setCheckable(true); //设置为可以选择
item->setCheckState(Qt::Unchecked);//设置初始化的状态为不选择的。
m_Student_model->appendRow(item); //将项目添加到模型中。
}
m_Teacher_model = new QStandardItemModel(0,1);
for(int i=0;i<10;i++)
{
QStandardItem *item= new QStandardItem(QString("老师:%1").arg(i));
item->setCheckable(true); //设置为可以选择
item->setCheckState(Qt::Unchecked); //设置状态
m_Teacher_model->appendRow(item);
}
m_Worker_model = new QStandardItemModel(0,1);
for(int i=0;i<10;i++)
{
QStandardItem *item= new QStandardItem(QString("工人:%1").arg(i));
item->setCheckable(true); //设置为可以选择
item->setCheckState(Qt::Unchecked); //设置状态
m_Worker_model->appendRow(item);
}
}
void listviewmodel_1::on_comboBox_01_currentIndexChanged(const QString &arg1)
{
if(arg1.contains("学生"))//如果选择的字符串包含“学生”,就设置他的模型为学生模型。
{
ui->listView_01->setModel(m_Student_model);
}
if(arg1.contains("老师"))
{
ui->listView_01->setModel(m_Teacher_model);
}
if(arg1.contains("工人"))
{
ui->listView_01->setModel(m_Worker_model);
}
}
//listviewmodel.h代码文件
//listviewmodel.h代码文件
#ifndef LISTVIEWMODEL_1_H
#define LISTVIEWMODEL_1_H
#include <QWidget>
#include <QStandardItemModel>
//在有中文代码的头文件中添加如下代码,解决中文乱码的问题。
#pragma execution_character_set("utf-8")
//
QT_BEGIN_NAMESPACE
namespace Ui { class listviewmodel_1; }
QT_END_NAMESPACE
class listviewmodel_1 : public QWidget
{
Q_OBJECT
public:
listviewmodel_1(QWidget *parent = nullptr);
~listviewmodel_1();
private slots:
void on_pushButton_ok_clicked();
void on_pushButton_no_clicked();
void on_comboBox_01_currentIndexChanged(const QString &arg1);
private:
Ui::listviewmodel_1 *ui;
QStandardItemModel *m_Student_model;
QStandardItemModel *m_Teacher_model;
QStandardItemModel *m_Worker_model ;
void init_model();
};
#endif // LISTVIEWMODEL_1_H