Russian Qt Forum

Qt => Общие вопросы => Тема начата: artb1sh от Август 07, 2015, 20:28



Название: Как перебрать все строки таблиц и сложить?
Отправлено: artb1sh от Август 07, 2015, 20:28
Привет tt мира:
как перебрать в QTableView все строки в таблицах и записать значения в результирующею таблицу?
Объяснение:
mytable:
........col1 col2 ......col3
lin1.....4......5..........-1
lin2.....3......5..........-2
lin3.....2......1..........1
lin4.....4......3..........1

Я хочу, отобразить разницу в таблице col3 по колонкам col1 и col2.
lin1(col1)-lin1(col2)=lin1(col3)
lin2(col1)-lin2(col2)=lin2(col3)
4-5=-1
3-5=-2
Спасибо


Название: Re: Как перебрать все строки таблиц и сложить?
Отправлено: gil9red от Август 07, 2015, 20:52
QTableView? А какую модель используете?

UPD.
Считаем, что ваша таблица уже имеет 3 колонки и заполнена, и то, что моделью будет QStandardItemModel

// Создаете цикл для перебора строк таблицы:
for (int row = 0; row < model.rowCount(); row++) {
    QStandardItem * item1 = model.item(row, 0);
    QStandardItem * item2 = model.item(row, 1);
    QStandardItem * item3 = model.item(row, 2);
    
    int result = item1->text().toInt() - item2->text().toInt();

    item3->setText(QString("%1").arg(result));
}

UPD2.
Алгоритм-то все равно такой :)

Вот пример получения записей в таблице:
QSqlQueryModel model;
model.setQuery("SELECT * FROM employee");
int salary = model.record(4).value("salary").toInt();

В которой record  (http://doc.qt.io/qt-4.8/qsqlquerymodel.html#record)принимает номер строки и возвращает ее содержимое, а value  (http://doc.qt.io/qt-4.8/qsqlrecord.html#value)-- принимает индекс столбца или его имя в таблице бд


Название: Re: Как перебрать все строки таблиц и сложить?
Отправлено: artb1sh от Август 07, 2015, 20:55
QSqlTableModel *model=new QSqlTableModel;
model->setTable("catalog");


Название: Re: Как перебрать все строки таблиц и сложить?
Отправлено: PimenS от Август 07, 2015, 22:02
Проще использовать для такого расчета сам сервер SQL.

Если данные получают из базы, не редактируя QTableView.

Вариант 1. Создать представление и загружать в модель уже готовые данные.
Вариант 2. Использовать не QSqlTableModel, а например QSqlQueryModel и соответственно запрос типа:
Код:
SELECT col1, col2, col1+col2 AS col3 FROM catalog

Если нужно редактировать, то лучше использовать свою модель и переопределить bool QAbstractItemModel::setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole)


Название: Re: Как перебрать все строки таблиц и сложить?
Отправлено: Hrundel от Август 08, 2015, 09:32
Ты же таблице назначаешь свою модель. Модель принимает данные и их хранит.
Значит напрямую внутри модели считай, без обращения к представлению. Для этого Interview и было разработано, чтобы мухи были отдельно, а котлеты отдельно.
Внутри модели у тебя есть какая-то структура данных. Напиши метод возвращающий сумму прямо из модели.


Название: Re: Как перебрать все строки таблиц и сложить?
Отправлено: artb1sh от Август 11, 2015, 13:55
А нельзя в последней таблице использовать данные не QSqlTableModel, а QSqlQueryModel?


Название: Re: Как перебрать все строки таблиц и сложить?
Отправлено: gil9red от Август 11, 2015, 16:22
А нельзя в последней таблице использовать данные не QSqlTableModel, а QSqlQueryModel?

А какая разница? QSqlTableModel наследуется от QSqlQueryModel  :)