1. 程式人生 > >Qt qsqlquerymodel 中文顯示亂碼問題解決

Qt qsqlquerymodel 中文顯示亂碼問題解決

在QT資料庫程式設計過程中,碰到了中文亂碼的問題,最終解決了


在Qt5將中文改成utf-8後預設是可以正常顯示的,所以中文亂碼就要看你的資料庫中儲存的資料是什麼編碼,如果是utf-8,那就要檢查你自己的Qt creator的配置,是不是預設utf-8的編碼。如果不是可以通過重寫QMySQlQueryModel::data函式來實現

.h檔案:

classQMyQueryModel:publicQSqlQueryModel

{
public:
explicitQMyQueryModel();
public:
QVariantdata(constQModelIndex&index,int
role)const;
protected:
};

.cpp檔案

QMySQlQueryModel::QMySQlQueryModel():QSqlQueryModel()

{
}
QVariantQMySQlQueryModel::data(constQModelIndex&item,introle)const
{
//解決model中文字不能居中
QVariantvalue=QSqlQueryModel::data(item,role);
if(role==Qt::TextAlignmentRole)
{
value=(Qt::AlignCenter);
returnvalue;
}
//修改model的編碼格式,解決model,view亂碼問題
if(role==Qt::DisplayRole)
{
QTextCodec*tc1=QTextCodec::codecForName("iso-8859-1");
QTextCodec*tc2=QTextCodec::codecForName("GBK");
QByteArraydata=tc1->fromUnicode(value.toString());
returntc2->toUnicode(data);
}
returnvalue;
}

就是在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");
QByteArraydata=tc1->fromUnicode(src);
returntc2->toUnicode(data);
}

顯示時呼叫即可:

newlabel5->setText((iso88591_to_gbk(openCountSqlModel->record(row).value("FT").toString())));//獲取第幾row行“FT”欄位的內容並顯示