2014-05-14 77 views
0

我自己创建的模型(MyListModel)存储我的对象列表MyObjMyObj存储一些文本信息。然后,我创建了类ItemDelegate,以管理每个项目的视图,并且还向每个项目添加QProgressBar。问题是我需要繁忙的进度条,但是当我执行应用程序时,QProgressBar不会执行任何操作。 busy progressbar don't work是否可以在QListView中使用正常功能的繁忙进度条?

我猜测,这是因为QListView只显示静态数据。有什么办法可以使它正常工作吗? 我的绘制方法的实现委托:

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

也许[QListView自定义项目](http://stackoverflow.com/questions/948444/qlistview-qlistwidget-with-custom-items)可以帮助一下。 – Trilarion

+0

至少显示委托代码。 –

+0

@Trilarion我正在使用已定制的项目,但它不起作用。 – Sunrise

回答

0

我认为存在问题,因为该视图重新绘制的项目,只有当事情发生变化。虽然模型数据保持不变,但根据单元不会重新绘制。

在这种情况下,您应该导致代理的额外重绘。不幸的是,没有方便的方法来做到这一点,但有更长的路要走。你需要做下面的动作在paint方法:

view->update(index); 

这里有两个问题:

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

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

+0

'view-> update(index);''paint'方法内部不起作用,从其他地方调用这个函数,检查它是否会帮助,很难,因为'paint'方法是' const',并且'QModelIndex'(paint的参数)不可能存储在'QItemDelegate'内,如果创建将发送'QModelIndex'的信号以及将执行'view-> update(index);'的槽,它可能会工作。但对我来说,最简单的解决方案是使用'QListWidget',在忙碌的进度条正常工作。 – Sunrise

相关问题