2017-05-08 1 views
0

QGraphicsTextItem 안의 선택된 텍스트의 강조 표시 색상을 변경하고 싶습니다.QGraphicsTextItem 내의 텍스트 강조 표시 색상 변경

나는 페인트 방법은 하위 클래스, 그래서 나는 그것이 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

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); 
    } 
}; 

그러나,이 솔루션은 완벽하지 않습니다 :

그것을 할 방법 단순화 된 방법입니다. 깜박이지 않는 텍스트 커서는 하나의 결함입니다. 아마도 다른 사람들이있을 것입니다. 그러나 나는 그것을 약간 향상시키는 것이 당신에게 그렇게 중요하지 않을 것이라고 생각합니다.