是否可以在QListView中使用具有正常功能的繁忙进度条?

时间:2014-05-14 20:03:34

标签: qt

我自己创建的模型( MyListModel )存储了我的对象列表 MyObj MyObj 会存储一些文字信息。然后我创建了类 ItemDelegate ,以便管理每个项目的视图,并为每个项目添加 QProgressBar 。问题是我需要繁忙的进度条,但是当我执行app时,QProgressBar不会执行任何操作。busy progressbar don't work

我猜测,因为 QListView 只显示静态数据。有没有办法让它正常工作? 我对Delegate的paint方法的实现:

void StatusItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    StatusItem my_item = index.data().value<StatusItem>();
    wdg->name->setText(my_item.m_name);
    switch (my_item.m_state)
    {
        case 0: wdg->progress->setMaximum(0);  wdg->progress->setMinimum(0); break;
        case 1: wdg->progress->setRange(0, 0); wdg->progress->setValue(100); break;
        case 2: wdg->progress->setHidden(true); break;
    }
    QPalette pal;
    QLinearGradient gradient(0, 0, 0, 100);

    if ((option.state & QStyle::State_Selected) == QStyle::State_Selected)
    {
        pal.setBrush(QPalette::Window, QBrush(QColor(0, 255, 200)));
    }
    else
    {
        gradient.setColorAt(0.0, QColor(255,250,0));
        gradient.setColorAt(1.0, QColor(255,255,255));
        pal.setBrush(QPalette::Window, QBrush(QColor(Qt::transparent)));
        pal.setBrush(QPalette::Window, QBrush(gradient));
    }
  wdg->setPalette(pal);
  wdg->resize(option.rect.size());
  painter->save();
  painter->setRenderHint(QPainter::Antialiasing, true);
  painter->translate(option.rect.topLeft());
  wdg->render(painter);

  painter->restore();
}

1 个答案:

答案 0 :(得分:0)

我认为问题的存在是因为视图仅在更改内容时重新绘制项目。虽然模型数据保持不变,但细胞不会重新粉刷。

在这种情况下,您应该从代理处进行额外的重新绘制。不幸的是,没有方便的方法,但有更长的方法。您需要在paint方法中执行以下操作:

view->update(index);

有两个问题:

  1. 您在view方法中没有paint指针。您可以尝试使用painter->device()并假设这是视图的视口(但无法保证)或将view存储在委托的类成员变量中

  2. update内调用paint会导致无限递归(我对此不确定)。如果是这种情况,您可以使用update推迟QTimer::singleShot(0, ...)。但是你需要为某个地方viewindex创建一个插槽,以便它们可以在插槽中访问。