【问题标题】:What is the best way to make a QTableView's cells have up and down button pushed states in Qt?使表格视图单元格在 Qt 中具有向上和向下按钮按下状态的最佳方法是什么?
【发布时间】:2009-06-09 15:04:40
【问题描述】:

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

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

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

另外,有没有更好的方法让单元格看起来像按钮?

【问题讨论】:

    标签: user-interface qt qtableview qitemdelegate


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      类似这样的...

      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 方法没有的原因。我会向诺基亚报告。

      编辑:

      看起来我是对的,它是 QStyleOptionViewItemV4 doesn't copy the icon and backgroundBrush

      【讨论】:

      • 我需要对上下状态图像进行此操作,而不仅仅是背景颜色。
      • 也许您可以为此使用 Qt::CheckStateRole 角色。
      【解决方案3】:

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

      【讨论】:

      • 是的,我想到了,但你必须有一个单独的颜色表,它不是那么优雅。我正在寻找更好的方法。
      • 我还需要按钮图像,而不是颜色。没有办法设置按钮图像并让它像处理颜色一样工作。
      【解决方案4】:

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

      【讨论】:

      • 你能用图片做这个吗?我需要为单元格的向下和向上状态设置 3D 按钮图像。
      【解决方案5】:

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

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

      【讨论】:

      • 鼠标按下和鼠标抬起事件是否有背景图像角色?我需要使表格单元格的行为类似于 3D 按钮。
      • 我认为您可以使用 QStyleOptionViewItem 的状态标志来检查项目是否被按下(有 QStyle::State_Sunken 值)。除此之外,您还可以使用 QStyleOptionButton 进行绘图
      【解决方案6】:

      我不确定背景图片的要求来自哪里。如果您希望单元格看起来像QPushButtons,您可能应该从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 );
      

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多