Russian Qt Forum

Qt => Базы данных => Тема начата: hank от Февраль 07, 2011, 10:32



Название: Вывод результата запроса в QTableView
Отправлено: hank от Февраль 07, 2011, 10:32
Здравствуйте.

Необходимо написать программу, которая выводит результаты запроса в компонент QTableView.
Для начала я поглядел на пример из книги Макса Шлее. Там это сделано примерно так:
Код:
createConnection();

QTableView     view;
QSqlQueryModel model;
model.setQuery("SELECT * FROM test;");
     
view.setModel(&model);
view.show();

Я всё делаю аналогично, но у меня в QTableView ничего не показывается. При этом если я делаю вот такой вот финт, то данные в табличке некоторое время отображаются:
Код:
for(int i=0; i<100000; ++i)
    ui->tableView->repaint();

Как решить проблему?


Название: Re: Вывод результата запроса в QTableView
Отправлено: Пантер от Февраль 07, 2011, 10:45
Модель и вьюха созданы на стеке, при выходе из функции они удалятся.


Название: Re: Вывод результата запроса в QTableView
Отправлено: hank от Февраль 07, 2011, 10:56
Мда, действительно  :)
Спасибо, заработало.


Название: Re: Вывод результата запроса в QTableView
Отправлено: hank от Февраль 07, 2011, 12:20
Спрошу здесь ещё кое-что.

Как из модели вывести содержимое конкретной ячейки таблицы или например одной строки или столбца?
То есть содержимое одной конкретной ячейки вывести на лейбл или что-то подобное, а содержимое столбца - в какой-нибудь комбобокс?


Название: Re: Вывод результата запроса в QTableView
Отправлено: Пантер от Февраль 07, 2011, 12:25
void QComboBox::setModel ( QAbstractItemModel * model )

Не нужно поднимать по несколько вопросов в одной теме, потом будет тяжело что-то найти. Один вопрос - одна тема.


Название: Re: Вывод результата запроса в QTableView
Отправлено: hank от Февраль 07, 2011, 13:40
Тогда ещё один вопрос по выводу в QTableView.

На одной кнопке у меня висит вывод данных из таблицы БД в QTableView:

Код:
model.setQuery("SELECT * FROM test", DB);

ui->tableView->setModel(&model);
ui->tableView->show();

На другую кнопку я вешаю добавление новой строки в таблицу:
Код:
model.setQuery("INSERT INTO test VALUES (1,2,3,4);

Значения успешно добавляются в БД, но вот содержимое QTableView исчезает, даже если я после добавления строки второй раз пишу
Код:
ui->tableView->setModel(&model);
ui->tableView->show();

Как быть?


Название: Re: Вывод результата запроса в QTableView
Отправлено: Пантер от Февраль 07, 2011, 13:43
Ты неверно делаешь. INSERT нужно делать через QSqlQuery. И после этого model.setQuery("SELECT * FROM test", DB);


Название: Re: Вывод результата запроса в QTableView
Отправлено: hank от Февраль 09, 2011, 12:58
Снова возникли трудности.

Попытался сделать вывод содержимого таблицы на QTableView как в примере их хелпа "Cached Table Example".
Там используется класс QSqlTableModel, а не QSqlQueryModel, который я пробовал раньше.

Делаю вот так:
Код:
QSqlTableModel model;

if (createConnection())
    {
        model.setTable("tab1");
        model.select();

        ui->tableView->setModel(&model);
        ui->tableView->show();
     }

Соединение с базой проходит успешно, переменная model объявлена глобально, но на tableView ничего не показывается. Что я делаю не так?


Название: Re: Вывод результата запроса в QTableView
Отправлено: Пантер от Февраль 09, 2011, 13:04
qDebug () << model.lastError ().text () что говорит?


Название: Re: Вывод результата запроса в QTableView
Отправлено: hank от Февраль 09, 2011, 13:18
Хмм. Выдает вот что:
" Unable to find table tab1"

Однако если я использую QSqlQueryModel, то всё работает:
Код:
QSqlQueryModel m1;
m1.setQuery("SELECT * FROM tab1");

ui->tableView_2->setModel(&m1);

То есть таблица tab1 таки существует.


Название: Re: Вывод результата запроса в QTableView
Отправлено: hank от Февраль 09, 2011, 15:40
Порылся в интернете и пришёл к неутешительным выводам.

Собственно аналогичную ошибку "Unable to find table" выдаёт и sqlbrowser из папки \demos в Qt.
После прочтения некоторых материалов (раз (http://www.prog.org.ru/topic_7957_0.html), два (http://www.litovchenko.com/blog/2008/07/qt4_postgresql_wtf/)) я понял, что проблема кроется в драйверах для подключения к серверу Postgres. У меня стоит сервер версии 9.0, но из-за ошибки в исходниках драйверов версия определяется как шестая, и из-за этого возникают какие-то косяки с определением названий таблиц.

В общем, надо либо откатываться на более ранню версию Postgres, либо самому пересобирать драйвера, либо как в хелпе вместо класса QSqlTableModel использовать самодельного потомка от класса QSqlQueryModel  :-[


Название: Re: Вывод результата запроса в QTableView
Отправлено: hank от Февраль 09, 2011, 16:32
Хмм.
А вот сейчас попробовал подключиться к другому серверу версии 7.4.
sqlbrowser из \demos работает, а я вот всё равно при использовании QSqlTableModel получаю "Unable to find table".
Какие идеи?


Название: Re: Вывод результата запроса в QTableView
Отправлено: sadhu от Февраль 09, 2011, 20:45
Версия Qt? Уверен что этого бага нет, если я правильно все понял, в версии 4.6.0, так как исправлял его (драйвер не правильно определял список доступных таблиц, точнее приводил все таблицы содержащие цыфры к верхнему регистру) в 4.5.1 на работе а потом выяснилось что в более поздних версиях оно исправлено.
Если версия одна из последних, то отпишись о баге тут bugreports.qt.nokia.com (http://bugreports.qt.nokia.com)


Название: Re: Вывод результата запроса в QTableView
Отправлено: hank от Февраль 10, 2011, 09:37
Версия Qt? Уверен что этого бага нет, если я правильно все понял, в версии 4.6.0, так как исправлял его (драйвер не правильно определял список доступных таблиц, точнее приводил все таблицы содержащие цыфры к верхнему регистру) в 4.5.1 на работе а потом выяснилось что в более поздних версиях оно исправлено.
Если версия одна из последних, то отпишись о баге тут bugreports.qt.nokia.com (http://bugreports.qt.nokia.com)
Версия Qt - 4.5.3 и работать я должен именно на ней.

Что касается названия таблиц, то вот так их названия выводятся правильно:
Код:
QStringList DBTables=DB.tables(QSql::Tables);

Более того, название интересующей меня таблицы я пытался выбрать вот так:
Код:
QString tableName = "Foo"; // исходное имя
QSqlDriver *dr = QSqlDatabase::database().driver();
tableName = dr->escapeIdentifier(tableName, QSqlDriver::TableName);
но тоже получил ошибку "Unable to find table".