本人近日在使用QT进行sqlite数据库编程时,出现中文数据显示乱码情况,附源码如下:
//main.cpp
#include <QtGui>
#include <QtCore/QTextCodec>
#include <QSqlTableModel>
#include <QTableView>
#include <QHeaderView>
#include <QSqlRecord>
#include <QtGui/QLabel>
#include <QString>
#include <QVariant>
#include "connection.h"
#include "sql.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
//创建数据库连接
if (!createConnection())
return 1;
//创建学生信息表
createTables();
//初始添加数据
addData();
enum{
Student_Id = 0,
Student_Schnum = 1,
Student_Name = 2,
Student_Sex = 3,
Student_Nation = 4
};
QSqlTableModel *model = new QSqlTableModel();
model->setTable("student");
model->setSort(Student_Schnum, Qt::AscendingOrder);
model->setHeaderData(Student_Schnum, Qt::Horizontal, QObject::tr("学号"));
model->setHeaderData(Student_Name, Qt::Horizontal, QObject::tr("姓名"));
model->setHeaderData(Student_Sex, Qt::Horizontal, QObject::tr("性别"));
model->setHeaderData(Student_Nation, Qt::Horizontal, QObject::tr("民族"));
model->select();
QTableView *view = new QTableView;
view->setModel(model);
view->setSelectionMode(QAbstractItemView::SingleSelection);
view->setSelectionBehavior(QAbstractItemView::SelectRows);
view->setColumnHidden(Student_Id, true);
view->resizeColumnsToContents();
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
QHeaderView *header = view->horizontalHeader();
header->setStretchLastSection(true);
view->show();
return a.exec();
}
//connection.h
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlDriver>
inline bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("sim.dat");
if (!db.open()) {
QMessageBox::warning(0, QObject::tr("Database Error"),
db.lastError().text());
return false;
}
return true;
}
#endif // CONNECTION_H
//sql.h
#include <QSqlQuery>
#ifndef SQL_H
#define SQL_H
inline void createTables()
{
QSqlQuery query;
query.exec("CREATE TABLE student ("
"id INTEGER PRIMARY KEY, "
"schnum INTEGER NOT NULL, "
"name VARCHAR(40) NOT NULL, "
"sex VARCHAR(4) NOT NULL, "
"nation VARCHAR(10) NOT NULL)");
}
inline void addData(){
QSqlQuery query;
for(int i =0;i<100;i++){
query.exec("INSERT INTO student (schnum, name, sex, nation) VALUES (2614103, '天残脚,'男', '汉族')");
}
}
#endif // SQL_H
上网查了许多无果,后来在阅读一篇技术文章中无意发现,原来在插入数据语句若有中文必须先QObject::tr()一番,即进行编码,
将Sql.h中query.exec("INSERT INTO student (schnum, name, sex, nation) VALUES (2614103, '天残脚,'男', '汉族')");改为如下query.exec(QObject::tr("INSERT INTO student (schnum, name, sex, nation) VALUES (2614103, '天残脚,'男', '汉族')"));
结果在显示中都能得正确显示。
注意,如果语句 QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));中的编码改为utf-8则会显示乱码。