Если вы используете QTableView
, я предполагаю, что вы используете модель, связанную с этим представлением.
Одним из решений будет использование делегатов (см. QItemDelegate
) для рисования прогресса, в QItemDelegate::paint
метод, который вы должны определить, используйте QStyle
виджета (widget->style()
), чтобы нарисовать прогресс (используйте QStyle::drawControl
с QStyle::CE_ProgressBarContents
в качестве идентификатора элемента управления).
Проверьте документацию из примера Star Delegate, чтобы узнать, как определить делегата для нужного вам столбца.
Позже отредактируйте: Пример определения метода рисования делегата (эскиз кода, на самом деле не проверенный, возьмите его за основу,не полностью работает).
void MyDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
QStyleOptionProgressBar progressStyle;
progressStyle.rect = option.rect; // Maybe some other initialization from option would be needed
// For the sake of the example, I assume that the index indicates the progress, and the next two siblings indicate the min and max of the progress.
QModelIndex minIndex = index.sibling( index.row(), index.column() + 1);
QModelIndex maxIndex = index.sibling( index.row(), index.column() + 2);
progressStyle.minimum = qvariant_cast< int>( minIndex.data( Qt::UserRole));
progressStyle.maximum = qvariant_cast< int>( maxIndex.data( Qt::UserRole));
progressStyle.progress = qvariant_cast< int>( index.data( Qt::UserRole));
progressStyle.textVisible = false;
qApp->style()->drawControl( QStyle::CE_ProgressBarContents, progressStyleOption, painter);
}