Здравствуйте

У меня в таблице БД есть поле BLOB для хранения текста.
Вопрос 1.Почему у меня некорректно (крокозябрами) отображается русский текст из BLOB в колонке QTableView ?
Вопрос 2.Как сделать, чтобы текст в колонке с BLOB не отображался весь в одну строку, а переносился ?
Вопрос 3.Что делать с шириной колонки для поля BLOB ? Ограничивать ?
Мои предположения:- не в той кодировке пишу данные в БД ?
- не везде, где надо, правильно указала кодировку ?
- мне необходимо создать делегат, чтобы в каждой ячейке QTableView колонки с BLOB был виджет QTextEdit ?
(Сейчас никакого делегата для этого QTableView у меня нет.)
Делаю так:в скриптах при создании БД:
----------------------
SET SQL DIALECT 3;
CREATE DATABASE 'D:\DB1.FDB' USER 'SYSDBA' PASSWORD 'masterkey'
DEFAULT CHARACTER SET WIN1251;
EXIT;
----------------------
SET SQL DIALECT 3;
SET NAMES WIN1251;
CONNECT 'D:\DB1.FDB' USER 'SYSDBA' PASSWORD 'masterkey';
CREATE DOMAIN D_INTEGER AS
INTEGER;
CREATE DOMAIN D_BLOB_TEXT_1000 AS
BLOB SUB_TYPE 1 SEGMENT SIZE 1000 --SUB_TYPE 1 == TEXT
CHARACTER SET WIN1251;
COMMIT;
EXIT;
----------------------
SET SQL DIALECT 3;
SET NAMES WIN1251;
CONNECT 'D:\DB1.FDB' USER 'SYSDBA' PASSWORD 'masterkey';
CREATE TABLE T_MSG (
F_RECORD_NMB D_INTEGER NOT NULL,
F_MSG_TEXT D_BLOB_TEXT_1000 NOT NULL
);
ALTER TABLE T_MSG ADD CONSTRAINT PK_T_MSG PRIMARY KEY (F_RECORD_NMB);
COMMIT;
EXIT;
----------------------
SET SQL DIALECT 3;
SET NAMES WIN1251;
CONNECT 'D:\DB1.FDB' USER 'SYSDBA' PASSWORD 'masterkey';
INSERT INTO T_MSG (F_RECORD_NMB, F_MSG_TEXT) VALUES (1, 'PRIVET: ПРИВЕТ');
INSERT INTO T_MSG (F_RECORD_NMB, F_MSG_TEXT) VALUES (2, 'OTVET: ОТВЕТ');
COMMIT WORK;
EXIT;
----------------------
В IBExpert при регистрации БД указываю:
- Charset = WIN1251
- оставляю не включенным (как по умолчанию и есть) флаг
Do NOT perform conversion from/to UTF8
- Font Characters Set = RUSSIAN_CHARSET
При этом в IBExpert данные поля BLOB таблицы отображаются корректно,
как и при включенном флаге (не совсем понимаю, что делает этот флаг).
#include <QtCore/QTextCodec>
#define RUSCODEC "CP1251"
int main(int argc, char *argv[])
{
...
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(RUSCODEC));
}
в mainwindow_db.cpp (в главном окне):
void MainWindow_db::create_model_msg_list()
{
//создание модели
model_msg_list = new QSqlTableModel(this);
model_msg_list->setEditStrategy(QSqlTableModel::OnFieldChange);
model_msg_list->setTable("T_MSG");
//задание заголовков столбцов
model_msg_list->setHeaderData(0, Qt::Horizontal, "№ сообщ.");
model_msg_list->setHeaderData(1, Qt::Horizontal, "Текст сообщ.");
//задание модели для представления
view_msg_list->setModel(model_msg_list);
view_msg_list->setSelectionMode(QAbstractItemView::SingleSelection); //сколько выделять: один
view_msg_list->setSelectionBehavior(QAbstractItemView::SelectRows); //что выделять: строки
view_msg_list->setEditTriggers(QAbstractItemView::NoEditTriggers); //представление табл доступно только для чтения
//установить ширину колонок
view_msg_list->resizeColumnsToContents();
view_msg_list->verticalHeader()->hide();
}
class MainWindow_db : public QMainWindow
{
Q_OBJECT
public:
MainWindow_db(QWidget *parent = 0);
QSqlTableModel *model_msg_list;
...
private:
QTableView *view_msg_list;
void create_model_msg_list();
...
}