我自己创建的模型( MyListModel )存储了我的对象列表 MyObj 。 MyObj 会存储一些文字信息。然后我创建了类 ItemDelegate ,以便管理每个项目的视图,并为每个项目添加 QProgressBar 。问题是我需要繁忙的进度条,但是当我执行app时,QProgressBar不会执行任何操作。
我猜测,因为 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();
}
答案 0 :(得分:0)
我认为问题的存在是因为视图仅在更改内容时重新绘制项目。虽然模型数据保持不变,但细胞不会重新粉刷。
在这种情况下,您应该从代理处进行额外的重新绘制。不幸的是,没有方便的方法,但有更长的方法。您需要在paint
方法中执行以下操作:
view->update(index);
有两个问题:
您在view
方法中没有paint
指针。您可以尝试使用painter->device()
并假设这是视图的视口(但无法保证)或将view
存储在委托的类成员变量中
在update
内调用paint
会导致无限递归(我对此不确定)。如果是这种情况,您可以使用update
推迟QTimer::singleShot(0, ...)
。但是你需要为某个地方view
和index
创建一个插槽,以便它们可以在插槽中访问。