QT-视图/模式下自定义进度条

简述:

       在之前项目中需要使用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()执行绘制函数才能生效。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QT自绘progress是指在QT框架下,通过自定义绘的方式实现进度条的效果。通过自绘可以实现更加个性化的进度条样式,满足不同的设计需求。 在QT中,可以通过继承QWidget或QProgressBar类来实现自绘progress。具体步骤如下: 1. 创建一个新的类,继承自QWidget或QProgressBar。 2. 重写paintEvent函数,在该函数中进行绘制操作。 3. 在paintEvent函数中,可以使用QPainter类进行绘制,例如绘制背景、进度条等。 4. 根据需要,可以使用QStyleOptionProgressBar类获取进度条的相关信息,例如当前值、最小值、最大值等。 5. 在绘制完成后,调用update函数进行界面刷新。 下面是一个简单的示例代码: ```cpp class CustomProgressBar : public QProgressBar { public: CustomProgressBar(QWidget *parent = nullptr) : QProgressBar(parent) {} protected: void paintEvent(QPaintEvent *event) override { Q_UNUSED(event); QPainter painter(this); QStyleOptionProgressBar option; initStyleOption(&option); // 绘制背景 painter.fillRect(rect(), Qt::gray); // 绘制进度条 option.rect.setWidth(rect().width() * value() / maximum()); option.text = QString("%1%").arg(value() * 100 / maximum()); option.textVisible = true; style()->drawControl(QStyle::CE_ProgressBar, &option, &painter, this); } }; ``` 使用该自定义进度条类时,只需要将其实例化并添加到布局中即可: ```cpp CustomProgressBar *progressBar = new CustomProgressBar; layout->addWidget(progressBar); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值