2017-02-11 23 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)); 
} 

有了这个,我现在可以从模型中采取的颜色和油漆委托的背景。