0

我正在尝试使单元格QTableView看起来像 3D 可点击按钮。因此,当您单击一个单元格时,该按钮看起来是按下的。每个人似乎都认为我只是想改变颜色,我需要显示一个普通按钮和一个按下按钮的图像,看起来是 3D 的。

我已经通过调用来完成此操作QTableView::setItemDelegate(),并使用适当ItemDelegate的方法在单击单元格时更改单元格的背景。但是我被困在这一点上,因为我希望某些单元格根据它们包含的数据成为不同颜色的按钮。因此,数字较小的单元格将是一个红色按钮,当它被单击时也是红色的,其他单元格将是不同的颜色。

我可以使用 设置按钮的颜色TableModel,但是一旦单击按钮,就无法ItemDelegate知道它应该是与其他颜色不同的颜色。您如何将两者联系起来,以便ItemDelegate知道它应该是什么颜色?

此外,是否有更好的方法让单元格看起来像按钮?

4

7 回答 7

1

您可以QModelIndex::model()ItemDelegate'spaint()方法中调用,因为它有一个QModelIndex参数。这为您TableModel提供了数据,您可以通过编程方式决定单元格按钮的颜色。

但是,这仍然没有我希望的那么优雅。有谁知道在向上和向下按钮按下状态时更改表格单元格外观的更好方法?

于 2009-06-09T15:17:09.157 回答
1

你为什么不向索引询问背景颜色。

像这样的东西...

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.backgroundBrush 在方法中是正确的,sizeHint但在方法中是无效的paint。我现在明白为什么sizeHint应该有背景画笔和paint方法没有的原因。我会向诺基亚报告。

编辑:

看起来我是对的,它是 < Qt4.5 中的一个错误。
QStyleOptionViewItemV4 不复制图标和backgroundBrush

于 2009-06-10T11:27:25.660 回答
0

您不能获取表格单元格行的 ID/行数,然后根据您可能拥有的颜色表检查它,并相应地设置颜色吗?我不确定我是否很好地理解了你的问题。

于 2009-06-09T15:08:26.337 回答
0

为背景颜色分配数据角色,并在您的项目委托中,询问模型索引它的背景颜色是什么(使用data( bg_color_role )或类似的东西)。然后,在您的模型中,您需要确保数据函数返回bg_color_role适合被建模数据的颜色。

于 2009-06-09T17:51:26.137 回答
0

这样做的方法是使用你在paint方法上获得的QModelIndex对象的data方法,并要求一个特定的角色(如果你定义了一个自定义模型,你可以添加你自己的角色,并给出你需要的信息担任这些角色的代表。)

TimW,我认为您必须先通过调用 initStyleOption 来填写 QStyleOptionViewItemV4 信息。

于 2009-06-18T13:20:33.597 回答
0

我不确定对背景图像的要求来自哪里。如果您希望单元格看起来像QPushButtons,您可能应该继承QItemDelegate并实现paint()用于QStyle绘制您的 a 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 );
于 2009-07-26T10:21:04.503 回答
0

您是否尝试过使用自定义样式表?

您可以将相同的样式表应用于每个单元格,然后根据是否选择它来更改背景图像/样式以绘制 3D 按钮图像。

于 2012-09-18T12:35:57.997 回答