简述:
在之前项目中需要使用QT开发批量升级过程的UI界面。需要在列表内显示进度条。列表规划的是用QT中的view/model形式实现。然后关于在列表内增加进度条。查了一些网上资料,单纯的加进度条很容易,但是改变进度条的样式,总是不生效。最后多方查找后找到了解决方案。仅以此文记录一下。
源码如下:
void PortListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (index.column() == PortListModel::ProgressCol)
{
int progress = index.data().toInt();
QStyleOptionProgressBar progressBarOption;
progressBarOption.initFrom(option.widget);
//设置进度条在单元格中的大小
QRect fillRect = option.rect.adjusted(10,10,-10,-10);
progressBarOption.rect = fillRect;
progressBarOption.minimum = 0; //进度条最小值
progressBarOption.maximum = 100; //进度条最大值
progressBarOption.textAlignment = Qt::AlignCenter; // 进度条居中显示
progressBarOption.progress = progress; 当前进度
progressBarOption.text = QString("%1%").arg(nProgress); //显示百分比
progressBarOption.textVisible = true; // 文本可显示
//设置进度条的式样
QProgressBar progressBar;
QString styleInfo = QString("QProgressBar::chunk {background: rgb(204, 48, 49);}");
progressBar.setStyleSheet(styleInfo);
QStyle *style = progressBar.style();
style->drawControl( QStyle::CE_ProgressBar, &progressBarOption, painter, &progressBar);
}
}
其中PortListDelegate是继承QStyledItemDelegate自定义的类。这里重写了QStyledItemDelegate中paint方法。
很多地方绘制进度条用的是 QApplication::style()
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter, &progressBar);
使用这个方法是无法修改式样的。一定要用定义的QProgressBar .style()执行绘制函数才能生效。