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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проблема со вставкой строки в таблицу  (Прочитано 7077 раз)
afro
Гость
« : Июль 05, 2015, 14:22 »

Здравствуйте!
Возникла проблема во время работы с QSqlDatabase
Вот то, что имеется на данный момент:
Код:
    QSqlQuery query;
    if(!query.exec("SELECT * FROM test_scheme.computers;")){
        qDebug()<<"Bad exec!";
        return;
    }

    qDebug()<<"Success!";
    model = new QSqlTableModel(this, db);
    for(int i = 0; query.next(); i++){
        model->insertRecord(i, query.record());
    }
    table->setModel(model);

В итоге таблица пустая. Думаю проблема связана с тем что перед вставкой в модель строк надо как то сформировать таблицу.
Как с этим разобраться?
« Последнее редактирование: Июль 05, 2015, 14:26 от afro » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #1 : Июль 05, 2015, 14:30 »

Попробуйте
Код:
    while(query.next()){
        model->insertRecord(i, query.record());
    }
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
afro
Гость
« Ответ #2 : Июль 05, 2015, 14:31 »

Попробуйте
Код:
    while(query.next()){
        model->insertRecord(i, query.record());
    }
А i каким задать? Пробовал с -1, эффект тот же
« Последнее редактирование: Июль 05, 2015, 14:34 от afro » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Июль 05, 2015, 14:53 »

Попробуйте
Код:
    while(query.next()){
        model->insertRecord(i, query.record());
    }
А i каким задать? Пробовал с -1, эффект тот же

Код:
int i = 0;
while(query.next()){
    model->insertRecord(i, query.record());
    i++;
}
Записан

afro
Гость
« Ответ #4 : Июль 05, 2015, 15:58 »

Не знаю как могла бы помочь замена одного цикла на другой, но это не помогло.
Всё таки есть другие предложения?
Может есть другие способы отобразить в tableView результат запроса к бд?
Нашёл ещё insertRow, но он принимает какой-то QModelIndex, вряд ли это то.

Есть внутренние догадки, что я упускаю какой-то шаг формирования структуры этой таблицы, ведь по сути я могу вызвать setRecord несколько  раз и с разными видами Record
« Последнее редактирование: Июль 05, 2015, 16:11 от afro » Записан
Nidxogg
Гость
« Ответ #5 : Июль 05, 2015, 16:36 »

Пробовали?
Код:
void QSqlTableModel::setTable ( const QString & tableName ) [virtual]


Или можно так, если только для просмотра
QSqlQueryModel
Код:
void QSqlQueryModel::setQuery ( const QSqlQuery & query )


« Последнее редактирование: Июль 05, 2015, 16:39 от Nidxogg » Записан
afro
Гость
« Ответ #6 : Июль 05, 2015, 16:59 »

Пробовали?
Код:
void QSqlTableModel::setTable ( const QString & tableName ) [virtual]
Или можно так, если только для просмотра
QSqlQueryModel
Код:
void QSqlQueryModel::setQuery ( const QSqlQuery & query )

Первый вариант пробовал, но у меня запрос (как это...) составной чтоли, то есть несколько таблиц затрагивает.
За второй вариант спасибо, но вот ошибка появляется.
Как его вызвать если он protected?

UPD использовал QSqlTableModel, понял ошибку
« Последнее редактирование: Июль 05, 2015, 17:08 от afro » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Июль 05, 2015, 17:14 »

Всё таки есть другие предложения?
В том цикле вывести в консоль значения, возможно ничего не нашлось и цикл вообще не выполнялся
Или нужно вручную указывать количество строк в таблице

Может есть другие способы отобразить в tableView результат запроса к бд?
Код
C++ (Qt)
   QSqlTableModel *model = new QSqlTableModel(parentObject, database);
   model->setTable("employee");
   model->setEditStrategy(QSqlTableModel::OnManualSubmit);
   model->select();
   model->setHeaderData(0, Qt::Horizontal, tr("Name"));
   model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
 
   QTableView *view = new QTableView;
   view->setModel(model);
   view->hideColumn(0); // don't show the ID
   view->show();
 
Записан

Nidxogg
Гость
« Ответ #8 : Июль 05, 2015, 19:35 »

Цитировать
Первый вариант пробовал, но у меня запрос (как это...) составной чтоли, то есть несколько таблиц затрагивает
The QSqlTableModel class provides an editable data model for a single database table.

Есть ещё вариант с QSqlRelationalTableModel
Цитировать
The QSqlRelationalTableModel class provides an editable data model for a single database table, with foreign key support.


P.S. У себя сложные запрос отображаю с помощью QSqlQueryModel, а редактирование (если требуется) через делегаты

Записан
afro
Гость
« Ответ #9 : Июль 05, 2015, 19:49 »

gil9red, Это пример для одной таблицы, у которой надо вывести 2 поля как я понял.
У меня же 3 таблицы и запрос
Код:
select a.id, t.name, c.name, c.ip, a.is_online 
from test_scheme.arms a, test_scheme.arm_types t, test_scheme.computers c
where a.comp_id = c.id and a.type_id = t.id;

То есть таблицы как таковой нет, результат запроса находиться в  QSqlQuery, и мне нужно вывести все записи(Record) из него в таблицу(на форму всмысле).

setQuery пока работает как надо. Примерно так:
Код:
 
    query = new QSqlQuery("select a.id, t.name, c.name, c.ip, a.is_online from test_scheme.arms a, test_scheme.arm_types t, test_scheme.computers c where a.comp_id = c.id and a.type_id = t.id;",db);
    model->setQuery(*query);
    table->setModel(model);
Но такой вариант readonly как я понял, изменять значения нельзя

Nidxogg, спасибо, в кьюте всего пару дней, никак не привыкну к справке)
Про делегаты не слышал, спасибо
Записан
afro
Гость
« Ответ #10 : Июль 06, 2015, 11:31 »

Дабы  не создавать новую тему спрошу здесь.
Как скрыть/удалить первый столбец в таблице?
Дело в том, что QSqlQuerymodel создаётся дополнительная колонка(в самом начале) с номерами записей, и после сортировки таблицы они перемешиваются и в общем то выглядят не красиво и не понятно.

 hideColumn(0) скрывает колонку id
Возможно можно отсортировать не затрагивая этот столбец
« Последнее редактирование: Июль 06, 2015, 11:46 от afro » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #11 : Июль 06, 2015, 12:21 »

Получаем вертикальный заголовок (QTableView::verticalHeader) и скрываем его (QHeaderView::hide).
Записан
afro
Гость
« Ответ #12 : Июль 06, 2015, 13:54 »

Получаем вертикальный заголовок (QTableView::verticalHeader) и скрываем его (QHeaderView::hide).
Премного благодарен
Записан
afro
Гость
« Ответ #13 : Июль 07, 2015, 11:02 »

Не знаю законно ли это, но решил ещё один вопрос тут задать.
Вздумалось мне закрасить один столбец каждую ячейку в зависимости от её значения.
Код:
    query = new QSqlQuery("select a.id, t.name, c.name, c.ip, a.is_online from kedr.arms a, kedr.arms_types t, kedr.computers c where a.computers_id = c.id and a.type_id = t.id;",db);
    model->setQuery(*query);
    model->setData(model->index(2,2), Qt::BackgroundRole, Qt::red);
    QSortFilterProxyModel *sqlproxy = new QSortFilterProxyModel(this);
    sqlproxy->setSourceModel(model);
    sqlproxy->setData(sqlproxy->index(2,2), Qt::BackgroundRole, Qt::red);
    sqlproxy->sort(sorted_col, Qt::AscendingOrder);
    table->verticalHeader()->hide();
    table->setModel(sqlproxy);

    table->model()->setData(table->model()->index(2,2), Qt::BackgroundRole, Qt::red);
    table->repaint();

Пробовал в qsqlquerymodel менять, - не вышло, пробовал в qsqlproxy - тоже не вышло
« Последнее редактирование: Июль 07, 2015, 11:08 от afro » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #14 : Июль 07, 2015, 11:59 »

А что, поиск по форуму уже поломался или в гугле забанили?
http://www.prog.org.ru/topic_15426_0.html
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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