Russian Qt Forum
Ноябрь 24, 2024, 00:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вывод результата запроса в QTableView  (Прочитано 14949 раз)
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();

Как решить проблему?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 07, 2011, 10:45 »

Модель и вьюха созданы на стеке, при выходе из функции они удалятся.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
hank
Гость
« Ответ #2 : Февраль 07, 2011, 10:56 »

Мда, действительно  Улыбающийся
Спасибо, заработало.
Записан
hank
Гость
« Ответ #3 : Февраль 07, 2011, 12:20 »

Спрошу здесь ещё кое-что.

Как из модели вывести содержимое конкретной ячейки таблицы или например одной строки или столбца?
То есть содержимое одной конкретной ячейки вывести на лейбл или что-то подобное, а содержимое столбца - в какой-нибудь комбобокс?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Февраль 07, 2011, 12:25 »

void QComboBox::setModel ( QAbstractItemModel * model )

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
hank
Гость
« Ответ #5 : Февраль 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();

Как быть?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Февраль 07, 2011, 13:43 »

Ты неверно делаешь. INSERT нужно делать через QSqlQuery. И после этого model.setQuery("SELECT * FROM test", DB);
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
hank
Гость
« Ответ #7 : Февраль 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 ничего не показывается. Что я делаю не так?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Февраль 09, 2011, 13:04 »

qDebug () << model.lastError ().text () что говорит?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
hank
Гость
« Ответ #9 : Февраль 09, 2011, 13:18 »

Хмм. Выдает вот что:
" Unable to find table tab1"

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

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

То есть таблица tab1 таки существует.
Записан
hank
Гость
« Ответ #10 : Февраль 09, 2011, 15:40 »

Порылся в интернете и пришёл к неутешительным выводам.

Собственно аналогичную ошибку "Unable to find table" выдаёт и sqlbrowser из папки \demos в Qt.
После прочтения некоторых материалов (раз, два) я понял, что проблема кроется в драйверах для подключения к серверу Postgres. У меня стоит сервер версии 9.0, но из-за ошибки в исходниках драйверов версия определяется как шестая, и из-за этого возникают какие-то косяки с определением названий таблиц.

В общем, надо либо откатываться на более ранню версию Postgres, либо самому пересобирать драйвера, либо как в хелпе вместо класса QSqlTableModel использовать самодельного потомка от класса QSqlQueryModel  Обеспокоенный
Записан
hank
Гость
« Ответ #11 : Февраль 09, 2011, 16:32 »

Хмм.
А вот сейчас попробовал подключиться к другому серверу версии 7.4.
sqlbrowser из \demos работает, а я вот всё равно при использовании QSqlTableModel получаю "Unable to find table".
Какие идеи?
Записан
sadhu
Гость
« Ответ #12 : Февраль 09, 2011, 20:45 »

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

Версия Qt? Уверен что этого бага нет, если я правильно все понял, в версии 4.6.0, так как исправлял его (драйвер не правильно определял список доступных таблиц, точнее приводил все таблицы содержащие цыфры к верхнему регистру) в 4.5.1 на работе а потом выяснилось что в более поздних версиях оно исправлено.
Если версия одна из последних, то отпишись о баге тут 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".
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 22.