Да, пожалуйста. Первые 10 записей одной из таблиц.
Вот решение костыльное немного более, чем полностью:
C++ (Qt)
#include <QApplication>
#include <QTextCodec>
#include <QSqlTableModel>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
#include <QTableView>
class CrutchesModel: public QSqlTableModel
{
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
{
QVariant value = QSqlTableModel::data(index, role);
if (value.type()==QVariant::String)
{
// если строка, то читаем шестнадцатиричное представление поля и из него получаем нашу CP1251 строку
QString queryString = "SELECT HEX([" + database().record(tableName()).fieldName(index.column()) + "]) FROM "+ tableName();
if (!filter().isEmpty())
queryString.append(" WHERE ").append(filter());
if (!orderByClause().isEmpty())
queryString.append(' ').append(orderByClause());
queryString.append(" LIMIT 1 OFFSET ").append(QString::number(index.row())).append(";");
QSqlQuery query = database().exec(queryString);
if (query.next())
{
return QString(QByteArray::fromHex(query.value(0).toByteArray()));
}
else
{
return QString();
}
}
return value;
};
bool setData (const QModelIndex & index, const QVariant & value, int role = Qt::EditRole)
{
if (value.type()==QVariant::String)
{
// строку пишем как массив байт
return QSqlTableModel::setData(index, value.toString().toAscii(), role);
}
return QSqlTableModel::setData(index, value, role);
};
};
int main(int argc, char *argv[])
{
QTextCodec *codec=QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForCStrings(codec);
QApplication a(argc, argv);
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.s3db");
CrutchesModel model;
model.setTable("instr");
model.select();
QTableView view;
view.setModel(&model);
view.show();
return a.exec();
}
Собственно в CrutchesModel переопределяем data и setData.
Увы родное data() возвращает сразу одни "знаки вопроса в ромбиках" и исходную строку приходится узнавать отдельным запросом к БД.
Так же вынужден заметить, что писать в setData оно реально будет не строку, а ByteArray (т.е. в понятиях SQLite'а - blob). Скорее всего это не вызовет проблем - SQLite к типам полей относится весьма фривольно, однако лучше эту подправленную БД опробовать на Delphi-программе, с которой вы работаете, чтобы убедиться что ничего не поломалось.
Исходный код программы в прикреплённом файле: