crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Отображение BLOB полей таблиц БД FireBird в QTableView Qt в Windows
Steklova Olga
  опции профиля:
сообщение 14.3.2012, 13:59
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Здравствуйте :) У меня в таблице БД есть поле 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 таблицы отображаются корректно,
как и при включенном флаге (не совсем понимаю, что делает этот флаг).

в main.cpp:
#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();
}
в mainwindow_db.h:
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();
    ...
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Steklova Olga
  опции профиля:
сообщение 15.3.2012, 15:13
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


6. Для теста изменила структуру таблицы T_MSG и ее заполнение, использовала другие домены:
CREATE DOMAIN D_VARCHAR_0020 AS
VARCHAR(20) CHARACTER SET WIN1251
COLLATE PXW_CYRL;
CREATE DOMAIN D_BLOB_TEXT_0020 AS
BLOB SUB_TYPE 1 SEGMENT SIZE 20 --SUB_TYPE 1 == TEXT
CHARACTER SET WIN1251;
CREATE TABLE T_MSG (
    F_RECORD_NMB D_INTEGER NOT NULL,
    F_MSG_TEXT_VC D_VARCHAR_0020 NOT NULL,
    F_MSG_TEXT_B D_BLOB_TEXT_0020 NOT NULL
);
INSERT INTO T_MSG (F_RECORD_NMB, F_MSG_TEXT_VC, F_MSG_TEXT_B)
VALUES (1, 'PRIVET1: ПРИВЕТ1', 'PRIVET1: ПРИВЕТ1');
INSERT INTO T_MSG (F_RECORD_NMB, F_MSG_TEXT_VC, F_MSG_TEXT_B)
VALUES (2, 'PRIVET2: ПРИВЕТ2', 'PRIVET2: ПРИВЕТ2');

7. Вставила в таблицу T_MSG записи (с номерами 3 и 4) с BLOB в коде программы с помощью QSqlQuery:
QString query_str;
QSqlQuery query;
query_str = "INSERT INTO T_MSG (F_RECORD_NMB, F_MSG_TEXT_VC, F_MSG_TEXT_B) "
  "VALUES (3, 'PRIVET3: ПРИВЕТ3', 'PRIVET3: ПРИВЕТ3')";
query.exec(query_str);
query_str = "INSERT INTO T_MSG (F_RECORD_NMB, F_MSG_TEXT_VC, F_MSG_TEXT_B) "
  "VALUES (4, 'PRIVET4: ПРИВЕТ4', 'PRIVET4: ПРИВЕТ4')";
query.exec(query_str);

В результате в QTableView: во всех записях (с номерами 1-4) в поле F_MSG_TEXT_VC русский есть, в поле F_MSG_TEXT_B русского нет.
Посмотрела данные таблицы T_MSG в IBExpert: во всех записях (с номерами 1-4) в полях F_MSG_TEXT_VC и F_MSG_TEXT_B русский есть.

Сообщение отредактировал Steklova Olga - 15.3.2012, 15:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Steklova Olga   Отображение BLOB полей таблиц БД FireBird в QTableView Qt в Windows   14.3.2012, 13:59
- - Алексей1153   1 - полагаю, блобу абсолютно пофиг на кодировку - ...   14.3.2012, 14:30
- - Steklova Olga   Цитата(Алексей1153)Возможно, нужно применить друго...   14.3.2012, 14:44
- - Алексей1153   Оля, ты, судя по всему, используешь Огнептицу я п...   14.3.2012, 20:01
|- - Tonal   Цитата(Алексей1153 @ 15.3.2012, 0:01) И п...   15.3.2012, 8:15
- - Алексей1153   Tonal, возможно   15.3.2012, 9:33
- - Steklova Olga   1. Использую FireBird 2.1 в Windows. 2. У меня тож...   15.3.2012, 11:33
- - Steklova Olga   6. Для теста изменила структуру таблицы T_MSG и ее...   15.3.2012, 15:13
- - Steklova Olga   8. Если оставить все как есть, но попробовать поме...   15.3.2012, 15:58
- - Steklova Olga   11. Кстати, Алексей1153, если в IBExpert открыть т...   15.3.2012, 18:51
- - Steklova Olga   Раньше, в пункте 7. делала так: ЦитатаВставила в т...   15.3.2012, 20:07
- - Алексей1153   Оля, сразу вот такой моментик. >>Я указываю...   16.3.2012, 8:09
- - Steklova Olga   Цитата(Алексей1153)сразу резко напрашивается испол...   16.3.2012, 10:41
- - Алексей1153   в другой то может,но как показывает практика,UTF-8...   16.3.2012, 11:09
- - Steklova Olga   17. Кодировку БД оставила WIN1251. Опять изменила ...   16.3.2012, 12:13
- - Алексей1153   . У тебя есть скайп ? Скинь в ЛС, а то так долго п...   16.3.2012, 12:41
- - Steklova Olga   OK   16.3.2012, 14:48
- - Litkevich Yuriy   Цитата(Steklova Olga @ 14.3.2012, 15:59) ...   3.4.2012, 19:56
- - Steklova Olga   И за что мне такое внимание сегодня с Вашей сторон...   3.4.2012, 21:57
- - Litkevich Yuriy   Вобщем есть такая проблема: По моему (и не только)...   4.4.2012, 11:03
- - Steklova Olga   Litkevich Yuriy, просмотрела кучу тем на prog.org....   5.4.2012, 20:21
- - Steklova Olga   Цитата(Алексей1153 @ 16.3.2012, 11:09) из...   18.4.2012, 11:59
- - Алексей1153   ещё мне что-то подсказывает, что более рационально...   18.4.2012, 12:16
- - Steklova Olga   Алексей1153, да, наверное. В книге Хелен Борри ...   18.4.2012, 13:10


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 9:30