在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”字段的内容并显示