牙牙将心的qt学习之路,03课,模型/视图编程 Model/View Programming

目录

Qt 16: 模型/视图简介和使用 (Model/View Programming)

//model_view1的mian.cpp代码文件

Qt 17:模型/视图编程实例 (Model/View Programming)

//ModelView01.cpp代码文件

//ModelView01.h代码文件

Qt 18 : 模型视图编程实例

//listviewmodel.cpp代码文件

//listviewmodel.h代码文件


Qt 17:模型/视图编程实例 (Model/View Programming)_哔哩哔哩_bilibili第17节QStandardItemModel/QTableView应用 (Model/View Programming)Model/View Programming的优点:1、在处理较大的数据集时每个组件各司其职,不至于降低性能。2、一个Model可以映射到多个View,这样可以以不同的方式查看数据同一份数据。3、如果底层数据源的存储改变了,我们只需要处理Model就可以了。4、编程实例(QStahttps://www.bilibili.com/video/BV1yx411r7qp/?spm_id_from=333.788.recommend_more_video.-1

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牙牙将心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值