是什么力量让一个TableView中的细胞具有向上和向下按钮按下的状态在Qt的最好方法是什么?
-
13-09-2019 - |
题
我试图做一个QTableView
的细胞看起来像3D可点击按钮。所以,当你点击一个单元格,按钮看起来推。 似乎每个人都认为我只是想改变颜色,我需要表现出正常的按钮和推按钮的图片,看起来三维的。
我有打电话QTableView::setItemDelegate()
,用适当的ItemDelegate
单击时,将改变细胞的背景已经做到了这一点。但是我卡在这一点上,因为我想要一些细胞是基于它们所包含的数据不同颜色的按钮。因此,与低数量的细胞将是一个红色按钮,这也是红色时,它的点击,和其他细胞将是不同的颜色。
我可以设置与TableModel
按钮的颜色,但一旦按钮被点击,就没有办法为ItemDelegate
知道它应该是一个不同的颜色比其他人。你怎么能链接两个这样的ItemDelegate
知道它应该是什么颜色呢?
此外,有没有简单地更好的方法,使细胞像按钮?
解决方案
可以从QModelIndex::model()
的ItemDelegate
方法中调用paint()
,因为它有一个QModelIndex
参数。这使你的数据,你可以通过编程决定细胞的按钮,会是什么颜色的TableModel
。
然而,这仍然不是优雅,我倒是希望。有谁知道一个更好的办法来改变表格单元格的外观,当在两个上下按钮按下的状态?
其他提示
你为什么不问背景色的索引。
像这样...
QStyleOptionToolButton buttonOption;
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option);
//...
buttonOption.palette.setBrush( QPalette::Button, index.data( Qt::BackgroundColorRole ) );
//...
我觉得它在Qt和错误的一定是...
// model code
if(role==Qt::BackgroundColorRole )
return qvariant_cast<QBrush>( QBrush(Qt::red) );
// delegate code
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );
由于该optionV4.backgroundBrus
h处于sizeHint
方法正确的,但是在paint
方法无效。我看到现在之所以sizeHint
应具备的背景画笔和paint
方法不行。我会向诺基亚报告。
编辑:搜索结果
看来我是对的,它在
您无法获取表格单元格的行的ID /行计数,然后检查它,你可以在具有颜色表,并设置相应的颜色?我不知道如果我理解你的问题好不好。
指定为背景色数据角色,并在您的项目委托,询问模型指标就是它的背景颜色(使用data( bg_color_role )
或类似的东西)。然后,在你的模型,你需要确保数据函数返回用于建模的数据是合适的bg_color_role
颜色。
做到这一点的方法是使用你上了漆方法QModelIndex对象的数据的方法,并要求一个特定的角色(如果定义了一个自定义模式,您可以添加自己的角色,并给予信息你需要在这些角色的委托。)
TIMW,我认为你必须填补之前调用initStyleOption的QStyleOptionViewItemV4信息。
我不知道在哪里的背景图像的需求从何而来。如果你想在细胞看起来像QPushButton
s,你应该从QItemDelegate
继承,并实现paint()
使用QStyle
画出你QPushButton
,是这样的:
QStyleOptionButton opt;
// fill 'opt' from the information from the model, and the style option that's passed in
style()->drawControl( QStyle::CE_PushButton, &opt, painter );
您是否尝试过使用自定义样式表?
您可以只应用相同的样式表的每一个细胞,然后更改背景图片/风格取决于它是否选中后的3D按钮图像绘制。