Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 制作QTableView';s细胞在Qt中有向上和向下按钮按下状态?_User Interface_Qt_Qtableview_Qitemdelegate - Fatal编程技术网

User interface 制作QTableView';s细胞在Qt中有向上和向下按钮按下状态?

User interface 制作QTableView';s细胞在Qt中有向上和向下按钮按下状态?,user-interface,qt,qtableview,qitemdelegate,User Interface,Qt,Qtableview,Qitemdelegate,我试图使QTableView的单元格看起来像3D可点击按钮。因此,当您单击单元格时,按钮看起来被按下了每个人似乎都认为我只是想改变颜色,我需要显示一个普通按钮和一个按下按钮的图像,它们看起来是三维的。 // model code if(role==Qt::BackgroundColorRole ) return qvariant_cast<QBrush>( QBrush(Qt::red) ); // delegate code buttonOption.palette

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

// model code  
if(role==Qt::BackgroundColorRole )
    return qvariant_cast<QBrush>( QBrush(Qt::red) );

// delegate code 
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );
我已经通过调用
QTableView::setItemDelegate()
实现了这一点,并使用了适当的
ItemDelegate
,它将在单击单元格时更改单元格的背景。然而,我在这一点上被卡住了,因为我希望一些单元格是基于它们包含的数据的不同颜色的按钮。因此,一个数字较低的单元格将是一个红色按钮,单击时也是红色的,其他单元格将是不同的颜色

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


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

您能否获取表格单元格行的ID/行计数,然后对照您可能拥有的颜色表进行检查,并相应地设置颜色?我不确定我是否理解您的问题。

您可以从
itemdegate
paint()
方法中调用
QModelIndex::model()
,因为它有一个
QModelIndex
参数。这将为您提供数据的
TableModel
,您可以通过编程确定单元格按钮的颜色


然而,这仍然不像我希望的那样优雅。是否有人知道在“向上”和“向下”按钮按下状态下更改表格单元格外观的更好方法?

为背景色指定一个数据角色,并在项目代理中询问模型索引的背景色是什么(使用
数据(bg\u color\u role)
或类似方法)。然后,在您的模型中,您需要确保数据函数为
bg\u color\u角色
返回一种适合所建模数据的颜色。

为什么不询问背景颜色的索引

像这样的

QStyleOptionToolButton buttonOption;
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option);
//...
buttonOption.palette.setBrush( QPalette::Button, index.data( Qt::BackgroundColorRole ) ); 
//...
QStyleOptionToolButton按钮选项;
常量QStyleOptionViewItemV4&optionV4=动态强制转换(选项);
//...
buttonOption.palete.setBrush(Qpalete::Button,index.data(Qt::BackgroundColorRole));
//...
我觉得这是Qt中的一个bug,它一定是…

// model code  
if(role==Qt::BackgroundColorRole )
    return qvariant_cast<QBrush>( QBrush(Qt::red) );

// delegate code 
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );
//模型代码
if(角色==Qt::BackgroundColorRole)
返回qvariant_cast(QBrush(Qt::红色));
//委托代码
buttonOption.palette.setBrush(QPalette::Button,optionV4.backgroundBrush);
因为
选项v4.backgroundBrus
h在
sizeHint
方法中是正确的,但在
paint
方法中无效。我现在明白了为什么
sizeHint
应该有背景笔刷,而
paint
方法没有。我会向诺基亚汇报的

编辑:

看起来我是对的,这是

实现这一点的方法是使用在paint方法上获得的QModelIndex对象的data方法,并请求指定角色(如果定义自定义模型,则可以添加自己的角色,并向这些角色中的代理提供所需的信息。)


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按钮图像。

是的,我想到了,但您必须有一个单独的颜色表,这不是很优雅。我正在寻找一个更好的方法。我还需要按钮的图像,而不是颜色。没有办法设置按钮图像并使其像处理颜色一样工作。您能处理图像吗?我需要为单元格的“向下”和“向上”状态设置3D按钮图像。我需要使用“向上”和“向下”状态图像,而不仅仅是背景颜色。也许您可以使用Qt::CheckStateRole角色来执行此操作。是否为“鼠标向下”和“鼠标向上”事件设置背景图像角色?我需要使表格单元格的行为类似于3D按钮。我认为您可以使用QStyleOptionViewItem的状态标志来检查项目是否被按下(有QStyle::state_凹陷值)。同时,您可以使用QStyleOptionButton进行绘图