Как поместить изображение и QProgressBar в QTableView? - PullRequest
4 голосов
/ 07 сентября 2010

Я разрабатываю какой-то менеджер загрузок и отображаю имя файла, его размер и оставшиеся байты в QTableView. Теперь я хочу визуализировать прогресс с QProgressBar и отображать изображение (чтобы указать, является ли это загрузкой или загрузкой). Как я могу добавить или отобразить QProgressBar и изображение внутри QTableView?

Ответы [ 5 ]

4 голосов
/ 07 сентября 2010

Если вы используете 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);
}
2 голосов
/ 20 апреля 2012
TrackDelegate::TrackDelegate(QObject *parent)
    : QItemDelegate(parent)
--------------------------------------------------------------------------------
void TrackDelegate::paint( QPainter* painter,
                           const QStyleOptionViewItem &option,
                           const QModelIndex &index) const
{
    QStyleOptionViewItem  viewOption(option);
    QImage image(m_RowBackGroundImagePath);
    QPixmap pixmap(m_RowBackGroundImagePath);
    qDebug()<<"forward"<<pixmap.width()<<pixmap.height();
    pixmap.scaled(option.rect.width(),option.rect.height());
    qDebug()<<"back"<<pixmap.width()<<pixmap.height();
    qDebug()<<option.rect.width()<<option.rect.height();
    QBrush brush(pixmap);
    painter->save();
    painter->fillRect(option.rect, brush/*QColor(238, 233, 233, 255)*/);
    painter->restore();
    viewOption.rect = QRect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height());
    // viewOption.palette.setColor(QPalette::Text, QColor(Qt::red));
    // viewOption.palette.setBrush ( QPalette::ButtonText, brush1);
    QItemDelegate::paint(painter, viewOption,index);

    int progress = index.model()->data(index,Qt::DisplayRole).toInt();
    QStyleOptionProgressBar progressBarOption;
    progressBarOption.rect = QRect(option.rect.x(), option.rect.y()+(SETHEIGHT - PROGRESSBARHEIGHT)/2, option.rect.width(), /*option.rect.height()*/PROGRESSBARHEIGHT);

    //qDebug()<<progressBarOption.rect.x()<<progressBarOption.rect.y()<<progressBarOption.rect.height()<<progressBarOption.rect.width();
    //qDebug()<<option.rect.x()<<option.rect.y()<<option.rect.height()<<option.rect.width();

    progressBarOption.state |= QStyle::State_Enabled;
    progressBarOption.direction = QApplication::layoutDirection();
    progressBarOption.fontMetrics = QApplication::fontMetrics();
    progressBarOption.minimum = 0;
    progressBarOption.maximum = 100;
    progressBarOption.textAlignment = Qt::AlignCenter;
    progressBarOption.textVisible = true;
    progressBarOption.progress = progress < 0 ? 0 : progress;
    progressBarOption.text = QString().sprintf("%d%%", progressBarOption.progress);
    QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
    break;
}
1 голос
/ 30 июня 2011

Вы, вероятно, хотите использовать QTableWidget для этого.У него есть метод, который позволяет добавлять виджеты, такие как QProgressBar.Это метод "setCellWidget".

0 голосов
/ 07 сентября 2010

QTableView не для отображения виджетов в макете. Используйте QGridLayout или другой подходящий макет и поместите виджеты в этот макет.

0 голосов
/ 07 сентября 2010

В QProgressBar есть слот с именем setValue (int) ,
Вы можете обновить его, отправив сигнал на этот индикатор прогресса из вашего файлового менеджера.
Этот должен быть разработан вТаким образом, он может проверить или контролировать состояние загрузки и периодически отправляет эти сигналы.

Хороший подход к управлению изображениями вверх / вниз / готово состоит в том, чтобы иметь дополнительный столбец в таблице с элементом изображения.
Было бы очень просто обновить изображение, если состояние сокета / соединения / файла поврежденоизменится.

Написание любого примера на самом деле означает написание программы для вас, поэтому я предлагаю опубликовать части проблем (если таковые имеются) с кодом, выполненным вами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...