Russian Qt Forum

Qt => Model-View (MV) => Тема начата: NetWorm от Август 11, 2011, 17:03



Название: Редактирование QTableView
Отправлено: NetWorm от Август 11, 2011, 17:03
Есть таблица заполненная предварительно данными типа |товар|цена|кол|сумма|

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


Название: Re: Редактирование QTableView
Отправлено: GreatSnake от Август 11, 2011, 17:30
Читать Программирование модель/представление (http://doc.crossplatform.ru/qt/4.7.x/model-view-programming.html)!!!


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 11, 2011, 18:59
Это я так понимаю мне надо написать Делегат к модели QStandartItemModel?


Название: Re: Редактирование QTableView
Отправлено: GreatSnake от Август 11, 2011, 21:16
Это я так понимаю мне надо написать Делегат к модели QStandartItemModel?
Неправильно понимаешь. Читай дальше.
Делегат нужен для отображения/редактирования данных.
Тебе же достаточно взять значения ячеек через QAbstractItemModel::data(), сложить их и поместить в результирующую ячейку через QAbstractItemModel::setData().


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 11, 2011, 21:23
Это то понятно! Но как мне определить событие что что была изменена ячейка! через Слот?
вот щас пробую как раз это, но пока не понимаю как слоту передать например индекс!


Название: Re: Редактирование QTableView
Отправлено: GreatSnake от Август 11, 2011, 21:29
Код
C++ (Qt)
void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ) [signal]


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 11, 2011, 21:34
Код
C++ (Qt)
connect(tempModel,SIGNAL(dataChanged(QModelIndex,QModelIndex)),tempModel,SLOT(editFinish()));
 

но как передать в функцию параметр например текущий индекс или item


Название: Re: Редактирование QTableView
Отправлено: GreatSnake от Август 11, 2011, 21:36
Код
C++ (Qt)
connect(tempModel,SIGNAL(dataChanged(QModelIndex,QModelIndex)),tempModel,SLOT(editFinish()));
 
но как передать в функцию параметр например текущий индекс или item
Код
C++ (Qt)
connect(tempModel,SIGNAL(dataChanged(QModelIndex,QModelIndex)),tempModel,SLOT(editFinish(QModelIndex)));
Только сигнал нужно вешать после заполнения таблицы или блокировать его перед перезаливкой.


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 11, 2011, 21:39
Вот почему тоне получает он индекса сего!!!


Название: Re: Редактирование QTableView
Отправлено: GreatSnake от Август 11, 2011, 21:41
Вот почему тоне получает он индекса сего!!!
Что значит не получает? Показывай имплементацию editFinish()?


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 11, 2011, 21:46
ВСе!!! Благодарю за помощь получилось!


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 11, 2011, 21:52
Тогда еще вопросик. А могу ли я как-то передать например не только индекс, а еще и ссылку на item?


Название: Re: Редактирование QTableView
Отправлено: GreatSnake от Август 11, 2011, 22:00
Тогда еще вопросик. А могу ли я как-то передать например не только индекс, а еще и ссылку на item?
Не понял про какой айтем идёт речь? QStandardItem?
Код
C++ (Qt)
QStandardItem* itemFromIndex ( const QModelIndex & index ) const


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 11, 2011, 22:04
так понятно надо идти в сторону itemData(index);


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 11, 2011, 22:28
И все же не пойму как дальше вот есть у меня индекс... Как мне таблице на той же строчки присвоить значение другой ячейке...

Код
C++ (Qt)
void uslStandardItemModel::editFinish(QModelIndex index){
 
   if (index.column() == 2 || index.column() == 4) {
       qDebug() << "Цена:" + itemData(index).value(2).toInt();
       qDebug() << "Кол: " + itemData(index).value(4).toInt();
       double summa = this->itemData(index).value(2).toDouble() * this->itemData(index).value(4).toInt();
       qDebug() << summa;
   }
}
 


Название: Re: Редактирование QTableView
Отправлено: GreatSnake от Август 11, 2011, 22:39
Как-то так:
Код
C++ (Qt)
void uslStandardItemModel::editFinish(const QModelIndex& index){
 
   if (index.column() == 2 || index.column() == 4) {
       qDebug() << "Цена:" + itemData(index).value(2).toInt();
       qDebug() << "Кол: " + itemData(index).value(4).toInt();
       double summa = this->itemData(index).value(2).toDouble() * this->itemData(index).value(4).toInt();
       qDebug() << summa;
       setData( this->index( index.row(), <result_column> ), QVariant( summa ) );
   }
}


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 12, 2011, 04:23
Код
C++ (Qt)
itemData(index).value(2).toInt();
- получается вот тут ничего нет. т.е. он типа ничего не получает!!!


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 12, 2011, 20:02
Код
C++ (Qt)
void uslStandardItemModel::editFinish(QModelIndex index){
   double cena = 0.00;
   int count   = 0;
   if (index.column() == 2)
       cena = this->itemData(index).value(0).toDouble();
   if (index.column() == 4)
       count   = this->itemData(index).value(0).toInt();
 
   double summa = cena * count;
   setData(this->index(index.row(),5),QVariant(summa));
}
 

Он выполняет это несколько раз? т.е. сколько столбцов столько раз выполняет цикл???


Название: Re: Редактирование QTableView
Отправлено: GreatSnake от Август 13, 2011, 15:28
Код
C++ (Qt)
itemData(index).value(2).toInt();
- получается вот тут ничего нет. т.е. он типа ничего не получает!!!
А почему бы прямо из индекса не брать данные?
Код
C++ (Qt)
index.data().toInt()


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 13, 2011, 16:37
Код
C++ (Qt)
   double cena = itemData(this->index(index.row(),2)).value(0).toDouble();
   int count   = itemData(this->index(index.row(),4)).value(0).toInt();
 
   double summa = cena * count;
   this->setData(this->index(index.row(),5),summa);

Я уже сделал вот так!!!!! Оно просто выполняется столько раз сколько колонок. А так я каждый раз получаю именно значение той колонки которую мне нужно....

Думаю вопрос закрыт... Благодарю за помощь!!!!


Название: Re: Редактирование QTableView
Отправлено: GreatSnake от Август 13, 2011, 18:55
При изменении значения в editFinish() опять отработает сигнал и снова вызовется editFinish(). По идее могло бы и зациклиться. Нужно просто менять значение 5-й колонки только при изменении 2-й или 4-й.


Название: Re: Редактирование QTableView
Отправлено: NetWorm от Август 13, 2011, 20:38
так придется заводить внешнюю переменную и следить за ее обнулением! Но мне этого так не хочется!!