2017-02-11 54 views
0

我對QTableView的行着色有一個相當具體的問題,主要問題是着色整個行的背景,但也使用不同列上的代表,這裏是我試過的:Qt-QTableview行代表行顏色

  • 自定義數據模型的實現data():此實現的問題是自定義委託(對於列)的背景在着色發生時不會更改。
  • 對於行實現QStyledItemDelegate,此方法完美適用於着色,問題是我無法爲該特定行分配任何其他列委託。
  • 對列執行QStyledItemDelegate,並且畫家填充整行的rectangle,這對我來說看起來幾乎是正確的,所有列都是有顏色的,問題是,在調整大小時,我得到了剪裁,並且時常會出現背景顏色在其他列上消失,截圖如下。

Picture when the colors are working

Picture after resizing, after clipping, it sometimes stops to this, can be fixed by defocusing the main window (click outside of it), accessing the context menu and other things like that

的事情是,一些列使用默認的編輯器/代表,以及一些使用自定義的。

問題是,什麼是最好的方法來實現呢?

或者,我可以畫整行並限制其他代表重畫他們的背景嗎?

+0

也許你應該展示你的模型的實現。 – drescherjm

+0

是否有一個原因,你是與委託而不是模型的樣式? – RobbieE

+0

我正在使用委託設計樣式,因爲在使用模型進行樣式設計時,不會爲其他委託的背景着色(例如:列爲CombBox),如第一個項目符號中所述。 – Lex

回答

0

我設法找到一個解決方案:

我的主要問題是,我的代表們不是爲了把它漆成採取的背景顏色從模型中,我從QItemDelegate複製後臺執行固定這實現,我需要在我的自定義委託的paint()方法來實現的片段是這樣的:

// draw the background color 
if (option.showDecorationSelected && (option.state & QStyle::State_Selected)) { 
    QPalette::ColorGroup cg = option.state & QStyle::State_Enabled 
           ? QPalette::Normal : QPalette::Disabled; 
    painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); 
} else { 
    QVariant value = index.data(Qt::BackgroundColorRole); 
    if (value.isValid() && qvariant_cast<QColor>(value).isValid()) 
     painter->fillRect(option.rect, qvariant_cast<QColor>(value)); 
} 

有了這個,我現在可以從模型中採取的顏色和油漆委託的背景。