在用QSqlQueryModel绑定tableview控件时,往往会遇到数据库里存储的数据与你table表里展现的数据不太一样,比如数据库里存储的0-1,tableview展现的是男-女;数据库里存储的日期+时间,而你只想日期,这时候需要重写QSqlQueryModel的data()函数;要让某列数据数据可编辑,比如学号可复制,需要重写flags方法
mysqlquery.h文件
#ifndef MYSQLQUERY_H
#define MYSQLQUERY_H
#include <QObject>
#include <QSqlQueryModel>
class MySqlQuery : public QSqlQueryModel
{
public:
MySqlQuery(QObject *parent);
QVariant data(const QModelIndex &item, int role=Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
private:
};
#endif // MYSQLQUERY_H
mysqlquery.cpp文件
#pragma execution_character_set("utf-8")
#include "mysqlquery.h"
#include <QSqlQuery>
#include <QDebug>
MySqlQuery::MySqlQuery(QObject *parent) : QSqlQueryModel(parent)
{
}
//
Qt::ItemFlags MySqlQuery::flags(
const QModelIndex &index) const //返回表格是否可更改的标志
{
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column()!=6&&index.column()!=7) //可编辑状态
flags |= Qt::ItemIsEditable;
return flags;
}
//更改数据显示样式-性别-出生日期
QVariant MySqlQuery::data(const QModelIndex &index, int role) const
{
QVariant value=QSqlQueryModel::data(index,role);
if(role==Qt::DisplayRole &&index.column()==4)
{
value=((value.toInt()==0)?"男生":"女生");
//qDebug()<<value.toInt();
return value;
}
if(role==Qt::DisplayRole &&index.column()==5)
{
value=value.toString().mid(0,10);
return value;
}
return value;
}
调用的时候,只需将QSqlQueryModel *model = new QSqlQueryModel(this);写成MySqlQuery *model=new MySqlQuery(this);即可
自带效果:
重写之后效果如下:
Qt 之 QSqlQueryModel Class详解参考https://blog.csdn.net/heaven_evil/article/details/77824578