如何将图像和QProgressBar放在QTableView中?

时间:2010-09-07 06:42:53

标签: c++ qt

我正在开发某种下载管理器并在QTableView中显示文件名,大小和剩余字节。现在我想用QProgressBar可视化进度并显示图像(以指示它是向下还是上传)。如何在QTableView中添加或显示QProgressBar和图像内部

5 个答案:

答案 0 :(得分:4)

如果您使用QTableView,我假设您使用链接到此视图的模型。

一种解决方案是使用代理(请参阅QItemDelegate)绘制进度,在您必须定义的QItemDelegate::paint方法中,使用窗口小部件的QStylewidget->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);
}

答案 1 :(得分:2)

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;
}

答案 2 :(得分:1)

你可能想要使用QTableWidget。它有一个方法,允许您添加像QProgressBar这样的小部件。这是“setCellWidget”方法。

答案 3 :(得分:0)

QProgressBar中有一个名为setValue(int)的插槽,
您可以更新它从您的文件管理器向此进度条发送信号 应该以可以检查或监视下载状态并定期发送这些信号的方式设计这个。

管理上/下/完成图像的好方法是在表格中添加带图像项目的附加列 如果套接字/连接/文件损坏状态发生变化,那么更新映像将非常容易。

写任何一个例子实际上都是在给你写一个程序,所以我建议用你自己的代码发布部分问题(如果有的话)。

答案 4 :(得分:0)

QTableView不适用于在布局中显示小部件。使用QGridLayout或其他一些合适的布局,并将小部件放在该布局中。