2014-05-14 23 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

相關問題