实现界面图:
源码如下:
创建个人信息类:
#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