自定义模型, 可以从类QAbstractTableModel类继承~~
下面是实现数值代码转换成文字的模型的一个简单实例。
~~~~~~~~~~~~~直接放码~~~~~~~~~~~~~
model_widget.h
#ifndef MODELWIDGET_H
#define MODELWIDGET_H
#include <QAbstractTableModel>
#include <QVector>
#include <QMap>
#include <QStringList>
#include <QTextCodec>
class ModelWidget : public QAbstractTableModel
{
public:
explicit ModelWidget(QObject *parent = 0);
int rowCount(const QModelIndex &parent=QModelIndex()) const;
int columnCount(const QModelIndex &parent=QModelIndex()) const;
QVariant data(const QModelIndex &index, int iRole) const;
QVariant headerData(int section, Qt :: Orientation orientation, int iRole) const; //--返回表头数据
private:
QVector<short> Role;
QVector<short> RoleType;
//--使用QMap保存数据结构为“数值-文字”
QMap<short, QString> RoleMap;
QMap<short, QString> RoleTypeMap;
QStringList RoleList;
QStringList header;
void InitTableData(); //--初始化表格数据并填充
};
#endif //MODELWIDGET_H
model_widget.
cpp
#include "model_widget.h"
ModelWidget::ModelWidget(QObject *parent /*= 0*/)
: QAbstractTableModel(parent)
{
//---解决中文乱码
QTextCodec *codec = QTextCodec::codecForName("GB18030");
RoleMap[1] = codec->toUnicode("冰结师");
RoleMap[2] = codec->toUnicode("黒魔后");
RoleMap[3] = codec->toUnicode("天帝");
RoleMap[4] = codec->toUnicode("流浪武士");
RoleMap[5] = codec->toUnicode("狂虎帝");
RoleMap[6] = codec->toUnicode("武极");
RoleMap[7] = codec->toUnicode("大魔导师");
RoleMap[8] = codec->toUnicode("天启者");
RoleMap[9] = codec->toUnicode("忍者");
RoleMap[10] = codec->toUnicode("黑暗武士");
RoleMap[11] = codec->toUnicode("缔造者");
RoleTypeMap[1] = codec->toUnicode("男魔法师");
RoleTypeMap[2] = codec->toUnicode("守护者");
RoleTypeMap[3] = codec->toUnicode("男鬼剑");
RoleTypeMap[4] = codec->toUnicode("女鬼剑");
RoleTypeMap[5] = codec->toUnicode("男格斗");
RoleTypeMap[6] = codec->toUnicode("女格斗");
RoleTypeMap[7] = codec->toUnicode("女魔法");
RoleTypeMap[8] = codec->toUnicode("圣职者");
RoleTypeMap[9] = codec->toUnicode("暗夜使者");
RoleTypeMap[10] = codec->toUnicode("缔造者");
//---调用初始化数据函数
InitTableData();
}
void ModelWidget::InitTableData()
{
//---解决中文乱码
QTextCodec *codec = QTextCodec::codecForName("GB18030");
header << codec->toUnicode("角色") << codec->toUnicode("角色类型")
<< codec->toUnicode("能否转职");
Role << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10<<11;
RoleType << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10<<11;
RoleList << codec->toUnicode("是") << codec->toUnicode("是")
<< codec->toUnicode("是")<< codec->toUnicode("是")
<< codec->toUnicode("是")<< codec->toUnicode("是")
<< codec->toUnicode("是")<< codec->toUnicode("是")
<< codec->toUnicode("是")<< codec->toUnicode("否")
<<codec->toUnicode("否");
}
/*
这里,将模型的列数固定为3, 直接返回3即可
*/
int ModelWidget::columnCount(const QModelIndex &parent/*=QModelIndex()*/) const
{
return 3;
}
/*
这里是返回模型的行数
*/
int ModelWidget::rowCount(const QModelIndex &parent/*=QModelIndex()*/) const
{
return Role.size();
}
/*
data函数返回指定索引的数据
*/
QVariant ModelWidget::data(const QModelIndex &index, int iRole) const
{
//----索引不为空
if (!index.isValid())
{
return QVariant();
}
//---在不同的情况下显示不同的数据
if (iRole == Qt :: DisplayRole)
{
switch (index.column())
{
case 0:
return RoleMap[Role[index.row()]];
break;
case 1:
return RoleTypeMap[RoleType[index.row()]];
break;
case 2:
return RoleList[index.row()];
default:
return QVariant();
break;
}
}
return QVariant();
}
/*
headerData()函数返回固定的表头数据,
*/
QVariant ModelWidget::headerData(int section, Qt :: Orientation orientation, int iRole) const
{
if (iRole == Qt:: DisplayRole && orientation == Qt :: Horizontal)
{
return header[section];
}
return QAbstractTableModel :: headerData(section, orientation, iRole);
}
main.cpp
#include <QtWidgets/QApplication>
#include <QTableView>
#include "model_widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//---解决中文乱码
QTextCodec *codec = QTextCodec::codecForName("GB18030");
ModelWidget win;
QTableView tableView;
tableView.setModel(&win);
tableView.resize(330, 370);
tableView.setWindowTitle(codec->toUnicode("地下城职业简介"));
tableView.show();
return a.exec();
}
运行效果