您的位置:首页 > 编程语言 > Qt开发

Qt学习之路之模型

2014-12-29 07:18 375 查看
自定义模型, 可以从类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();
}
运行效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: