在QT数据库编程过程中,碰到了中文乱码的问题,最终解决了
在Qt5将中文改成utf-8后默认是可以正常显示的,所以中文乱码就要看你的数据库中保存的数据是什么编码,如果是utf-8,那就要检查你自己的Qt creator的配置,是不是默认utf-8的编码。如果不是可以通过重写QMySQlQueryModel::data函数来实现
.h文件:
class QMyQueryModel:publicQSqlQueryModel
{
public:
explicit QMyQueryModel();
public:
QVariant data(const QModelIndex &index, int role) const;
protected:
};
.cpp文件
QMySQlQueryModel::QMySQlQueryModel():QSqlQueryModel()
{
}
QVariant QMySQlQueryModel::data(const QModelIndex &item, int role) const
{
//解决model中文字不能居中
QVariant value = QSqlQueryModel::data(item, role);
if(role == Qt::TextAlignmentRole )
{
value = (Qt::AlignCenter);
return value;
}
//修改model的编码格式,解决model,view乱码问题
if(role == Qt::DisplayRole)
{
QTextCodec *tc1 = QTextCodec::codecForName("iso-8859-1");
QTextCodec *tc2 = QTextCodec::codecForName("GBK");
QByteArray data= tc1->fromUnicode(value.toString());
return tc2->toUnicode(data);
}
return value;
}
就是在role为DisplayRole时,将显示的格式修改即可,我这边读取的是别人家的数据库,编码格式是"iso-8859-1"格式,把转换后的return即可。
当需要单独显示某一个字段时,可以自己写一个转换函数,显示的时候调用转换函数
//转换函数
QString openCountNotice::iso88591_to_gbk(QStringconst &src)
{
QTextCodec *tc1 = QTextCodec::codecForName("iso-8859-1");
QTextCodec *tc2 = QTextCodec::codecForName("GBK");
QByteArray data = tc1->fromUnicode(src);
return tc2->toUnicode(data);
}
显示时调用即可:
newlabel5->setText((iso88591_to_gbk(openCountSqlModel->record(row).value("FT").toString())));//获取第几row行“FT”字段的内容并显示