更改QGraphicsTextItem内文本的突出显示颜色

时间:2017-05-08 21:51:57

标签: qt highlight qgraphicsitem textcolor

我想更改QGraphicsTextItem内所选文字的突出显示颜色。

我将paint方法子类化了,所以我认为它可以像在QStyleOptionGraphicsItem上设置不同的调色板一样简单 - 但我看不到任何示例,我尝试的不起作用:

void TextItem::paint(QPainter* painter,
                     const QStyleOptionGraphicsItem* option,
                     QWidget* widget)
{
    QStyleOptionGraphicsItem opt(*option);

    opt.palette.setColor(QPalette::HighlightedText, Qt::green);

    QGraphicsTextItem::paint(painter, &opt, widget);
}

这没效果......

如何更改项目中所选文字的高亮颜色?

1 个答案:

答案 0 :(得分:1)

QGraphicsTextItem::paint()的默认实施并不关心QStyleOptionGraphicsItem::palette。如果您想要不同的颜色,则必须实现自定义绘画。

这是简化方式如何做到这一点:

class CMyTextItem : public QGraphicsTextItem
{
  public:
    virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
    {      
      QAbstractTextDocumentLayout::PaintContext ctx;
      if (option->state & QStyle::State_HasFocus)
        ctx.cursorPosition = textCursor().position();

      if (textCursor().hasSelection()) 
      {
        QAbstractTextDocumentLayout::Selection selection;
        selection.cursor = textCursor();

        // Set the color.
        QPalette::ColorGroup cg = option->state & QStyle::State_HasFocus ? QPalette::Active : QPalette::Inactive;
        selection.format.setBackground(option->state & QStyle::State_HasFocus ? Qt::cyan : ctx.palette.brush(cg, QPalette::Highlight));
        selection.format.setForeground(option->state & QStyle::State_HasFocus ? Qt::blue : ctx.palette.brush(cg, QPalette::HighlightedText));

        ctx.selections.append(selection);       
      }      

      ctx.clip = option->exposedRect;
      document()->documentLayout()->draw(painter, ctx);

      if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus))
        highlightSelected(this, painter, option);
    }
};

然而,这种解决方案并不完美。不闪烁的文本光标是一个不完美的。可能还有其他人。但是我认为改善它对你来说不是什么大问题。