Russian Qt Forum

Qt => Вопросы новичков => Тема начата: afro от Июль 05, 2015, 14:22



Название: Проблема со вставкой строки в таблицу
Отправлено: 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);

В итоге таблица пустая. Думаю проблема связана с тем что перед вставкой в модель строк надо как то сформировать таблицу.
Как с этим разобраться?


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: sergek от Июль 05, 2015, 14:30
Попробуйте
Код:
    while(query.next()){
        model->insertRecord(i, query.record());
    }


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: afro от Июль 05, 2015, 14:31
Попробуйте
Код:
    while(query.next()){
        model->insertRecord(i, query.record());
    }
А i каким задать? Пробовал с -1, эффект тот же


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: gil9red от Июль 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++;
}


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

Есть внутренние догадки, что я упускаю какой-то шаг формирования структуры этой таблицы, ведь по сути я могу вызвать setRecord несколько  раз и с разными видами Record


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: Nidxogg от Июль 05, 2015, 16:36
Пробовали?
Код:
void QSqlTableModel::setTable ( const QString & tableName ) [virtual]


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




Название: Re: Проблема со вставкой строки в таблицу
Отправлено: afro от Июль 05, 2015, 16:59
Пробовали?
Код:
void QSqlTableModel::setTable ( const QString & tableName ) [virtual]
Или можно так, если только для просмотра
QSqlQueryModel
Код:
void QSqlQueryModel::setQuery ( const QSqlQuery & query )

Первый вариант пробовал, но у меня запрос (как это...) составной чтоли, то есть несколько таблиц затрагивает.
За второй вариант спасибо, но вот ошибка появляется.
Как его вызвать если он protected?
(http://cs540108.vk.me/c612424/u72290118/docs/1ed6bb3ff9ba/error.png)
UPD использовал QSqlTableModel, понял ошибку


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: gil9red от Июль 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();
 


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: Nidxogg от Июль 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, а редактирование (если требуется) через делегаты



Название: Re: Проблема со вставкой строки в таблицу
Отправлено: afro от Июль 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, спасибо, в кьюте всего пару дней, никак не привыкну к справке)
Про делегаты не слышал, спасибо


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: afro от Июль 06, 2015, 11:31
Дабы  не создавать новую тему спрошу здесь.
Как скрыть/удалить первый столбец в таблице?
Дело в том, что QSqlQuerymodel создаётся дополнительная колонка(в самом начале) с номерами записей, и после сортировки таблицы они перемешиваются и в общем то выглядят не красиво и не понятно.
(http://cs612624.vk.me/u72290118/docs/63483d06a863/qt.png)
 hideColumn(0) скрывает колонку id
Возможно можно отсортировать не затрагивая этот столбец


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: Hellraiser от Июль 06, 2015, 12:21
Получаем вертикальный заголовок (QTableView::verticalHeader) и скрываем его (QHeaderView::hide).


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: afro от Июль 06, 2015, 13:54
Получаем вертикальный заголовок (QTableView::verticalHeader) и скрываем его (QHeaderView::hide).
Премного благодарен


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: afro от Июль 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 - тоже не вышло


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: Hellraiser от Июль 07, 2015, 11:59
А что, поиск по форуму уже поломался или в гугле забанили?
http://www.prog.org.ru/topic_15426_0.html (http://www.prog.org.ru/topic_15426_0.html)


Название: Re: Проблема со вставкой строки в таблицу
Отправлено: Nidxogg от Июль 07, 2015, 18:33
Цитировать
Вздумалось мне закрасить один столбец каждую ячейку в зависимости от её значения.
Можно через QStyledItemDelegate и переопределить метод paint
Можно унаследоваться от QSqlQueryModel и переопределить метод data