Qt模型视图 - 自定义模型类

实现界面图:

源码如下:

创建个人信息类:

#ifndef PERSONINFO_H
#define PERSONINFO_H

#include <QObject>
#include <QString>

class PersonInfo : public QObject
{
    Q_OBJECT
    QString m_strName;
    QString m_strId;
    int m_age;
    QString m_strQQ;
public:
    explicit PersonInfo(QObject *parent = nullptr);
    explicit PersonInfo(QString name, QString id, int age, QString QQ, QObject *parent = nullptr);
    PersonInfo(const PersonInfo& person);
    PersonInfo& operator=(const PersonInfo& person);
    
    QString Name();
    QString id();
    int age();
    QString QQ();
    
    
};

#endif // PERSONINFO_H

#include "PersonInfo.h"

PersonInfo::PersonInfo(QObject *parent) : QObject(parent)
{
    m_strName = "";
    m_strId = "";
    m_strQQ = "";
    m_age = 0;
}

PersonInfo::PersonInfo(QString name, QString id, int age, QString QQ, QObject * parent)
{
    Q_UNUSED(parent);
    m_strName = name;
    m_strId = id;
    m_strQQ = QQ;
    m_age = age;
}

PersonInfo::PersonInfo(const PersonInfo& person) : QObject( NULL )
{
    m_strName = person.m_strName;
    m_strId = person.m_strId;
    m_strQQ = person.m_strQQ;
    m_age = person.m_age;
}

PersonInfo& PersonInfo::operator=(const PersonInfo& person)
{
    if(this != &person)
    {
        m_strName = person.m_strName;
        m_strId = person.m_strId;
        m_strQQ = person.m_strQQ;
        m_age = person.m_age;
    }
    
    return *this;
}

QString PersonInfo::Name()
{
    return m_strName;
}

QString PersonInfo::id()
{
    return m_strId;
}
int PersonInfo::age()
{
    return m_age;
}

QString PersonInfo::QQ()
{
    return m_strQQ;
}




创建数据源类

#ifndef DATASOURCE_H
#define DATASOURCE_H

#include <QObject>
#include <QString>
#include <QList>
#include <PersonInfo.h>

class DataSource : public QObject
{
    Q_OBJECT
    
    QList<PersonInfo> m_stData;
    bool parse(QString line, PersonInfo& person);
public:
    explicit DataSource(QObject *parent = nullptr);
    bool setDataPath(QString path);
    QList<PersonInfo> fetchData();
    int count();
    
};

#endif // DATASOURCE_H
#include "DataSource.h"
#include <QFile>
#include <QTextStream>
#include <QStringList>
#include <QTextCodec>

DataSource::DataSource(QObject *parent) : QObject(parent)
{
    
}

bool DataSource::setDataPath(QString path)
{
    bool ret = true;
    QFile file(path);
    
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream in(&file);
        QTextCodec* codec = QTextCodec::codecForName("UTF-8");
        in.setCodec(codec);
        
        while(!in.atEnd())
        {
            PersonInfo person;
            
            if(parse(in.readLine(), person))
            {
                m_stData.append(person);
            }
        }
        
        file.close();
    }
    else
    {
        ret = false;
    }
    
    return ret;
}

bool DataSource::parse(QString line, PersonInfo& person)
{
    bool ret = true;
    
    QStringList list = line.split(",", QString::SkipEmptyParts);
    
    if(list.size() == 4)
    {
        int age = list[2].toUInt(&ret);
        
        if(ret && (age>0))
        {
            person = PersonInfo(list[0], list[1], age, list[3]);
        }
        else
        {
            ret = false;
        }
    }
    else
    {
        ret = false;
    }
    
    return ret;
}

QList<PersonInfo> DataSource::fetchData()
{
    QList<PersonInfo> stPerson = m_stData;
    
    m_stData.clear();
    
    return stPerson;
}

int DataSource::count()
{
    return m_stData.count();
}

创建自定义模型类:

#ifndef PERSONINFOMODEL_H
#define PERSONINFOMODEL_H

#include <QObject>
#include <PersonInfo.h>
#include <QList>
#include <QTableView>
#include <QStandardItemModel>
#include <QStandardItem>

class PersonInfoModel : public QObject
{
    Q_OBJECT
    QStandardItemModel m_model;
    
    void Headerlabel();
public:
    explicit PersonInfoModel(QObject *parent = nullptr);
    bool add(PersonInfo info);
    bool add(QList<PersonInfo> list);
    bool remove(int i);
    PersonInfo getItem(int i);
    int count();
    void clear();
    void setView(QTableView& view);
    
};

#endif // PERSONINFOMODEL_H
#include "PersonInfoModel.h"



PersonInfoModel::PersonInfoModel(QObject *parent) : QObject(parent)
{
    Headerlabel();
}

bool PersonInfoModel::add(PersonInfo info)
{
    bool ret = true;
    QStandardItem* item1 = new QStandardItem();
    QStandardItem* item2 = new QStandardItem();
    QStandardItem* item3 = new QStandardItem();
    QStandardItem* item4 = new QStandardItem();
    
    if( (NULL != item1) && (NULL != item2) && (NULL != item3) && (NULL != item4) )
    {
        item1->setData(info.Name(), Qt::DisplayRole);
        item2->setData(info.id(), Qt::DisplayRole);
        item3->setData(info.age(), Qt::DisplayRole);
        item4->setData(info.QQ(), Qt::DisplayRole);
        
        item1->setEditable(false);
        item2->setEditable(false);
        item3->setEditable(false);
        item4->setEditable(false);
        
        int row = count();
        
        m_model.setItem(row, 0, item1);
        m_model.setItem(row, 1, item2);
        m_model.setItem(row, 2, item3);
        m_model.setItem(row, 3, item4);
    }
    else
    {
        ret = false;
    }
    
    return ret;
}

bool PersonInfoModel::add(QList<PersonInfo> list)
{
    bool ret = true;
    
    for(int i=0; i<list.size(); i++)
    {
        ret = ret && add(list[i]);
    }
    
    return ret;
}

bool PersonInfoModel::remove(int i)
{
    bool ret = true;
    
    if( (0<=i) && (i<count()) )
    {
        m_model.takeRow(i);
    }
    else
    {
        ret = false;
    }
    
    return ret;
}

PersonInfo PersonInfoModel::getItem(int i)
{
    PersonInfo person;
    
    if( (0<=i) && (i<count()) )
    {
        QModelIndex index1 = m_model.index(i, 0, QModelIndex());
        QModelIndex index2 = m_model.index(i, 1, QModelIndex());
        QModelIndex index3 = m_model.index(i, 2, QModelIndex());
        QModelIndex index4 = m_model.index(i, 3, QModelIndex());
        
        person = PersonInfo(index1.data(Qt::DisplayRole).toString(), index2.data(Qt::DisplayRole).toString(), index3.data(Qt::DisplayRole).toInt(), index4.data(Qt::DisplayRole).toString());
    }
    
    return person;
}

int PersonInfoModel::count()
{
    return m_model.rowCount();
};

void PersonInfoModel::clear()
{
    m_model.clear();
    Headerlabel();
}

void PersonInfoModel::setView(QTableView& view)
{
    view.setModel(&m_model);
}

void PersonInfoModel::Headerlabel()
{
    QStringList list;
    
    list << QString::fromLocal8Bit("姓名")
         << QString::fromLocal8Bit("ID号")
         << QString::fromLocal8Bit("年龄")
         << QString::fromLocal8Bit("QQ号");
    
    m_model.setHorizontalHeaderLabels(list);
}





视图显示层:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTableView>
#include <QString>
#include <QPushButton>
#include <QMenu>
#include <PersonInfoModel.h>
#include <QObject>

class Widget : public QWidget
{
    Q_OBJECT
    
    PersonInfoModel m_model;
    QTableView m_view;
    QPushButton m_refreshBtn;
    QPushButton m_clearBtn;
    QMenu m_menu;
    
    
protected slots:
    void OnRefreshBtn();
    void OnClearBtn();
    void OnDelete();
    
    
public:
    Widget(QWidget *parent = nullptr);
    bool eventFilter(QObject *watched, QEvent *event);
    ~Widget();
};
#endif // WIDGET_H
#include "Widget.h"
#include <QDebug>
#include <QMessageBox>
#include <DataSource.h>
#include <PersonInfo.h>
#include <QHeaderView>
#include <QVBoxLayout>
#include <QHBoxLayout>

Widget::Widget(QWidget *parent) : QWidget(parent, Qt::WindowFlags()|Qt::WindowCloseButtonHint)
{
    m_refreshBtn.setText("Refresh");
    m_clearBtn.setText("Clear");
    
    QVBoxLayout* vLayout = new QVBoxLayout();
    QHBoxLayout* hLayout = new QHBoxLayout();
    
    hLayout->addWidget(&m_refreshBtn);
    hLayout->addWidget(&m_clearBtn);
    vLayout->addWidget(&m_view);
    vLayout->addLayout(hLayout);
    
    m_view.horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    m_view.installEventFilter(this);
    m_menu.addAction("Delete", this, SLOT(OnDelete()));
    connect(&m_refreshBtn, SIGNAL(clicked()), this, SLOT(OnRefreshBtn()));
    connect(&m_clearBtn, SIGNAL(clicked()), this, SLOT(OnClearBtn()));
    
    m_model.setView(m_view);
    setLayout(vLayout);
    
    setFixedSize(600, 300);
    
    OnRefreshBtn();
}

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if( (watched == &m_view) && (event->type() == QEvent::ContextMenu) )
    {
        m_menu.exec(cursor().pos());
    }
    
    return QWidget::eventFilter(watched, event);
}

void Widget::OnRefreshBtn()
{
    m_model.clear();
    
    DataSource data;
    
    if(data.setDataPath("./Source.txt"))
    {
        m_model.add(data.fetchData());
    }
    else
    {
        QMessageBox::critical(this, "Error", "Data source read error!", QMessageBox::Ok);
    }
}

void Widget::OnClearBtn()
{
    m_model.clear();
}

void Widget::OnDelete()
{
    m_model.remove(m_view.currentIndex().row());
}

Widget::~Widget()
{
}

运行效果图:

 工程链接:https://download.csdn.net/download/weixin_41937297/34246306

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值