Search code examples
qtqgraphicsitem

increase selection outline width in QGraphicsTextitem


i have a QGraphicsTextitem with text interaction where user can edit the current text and add the new text . but my new requirement is to increase the selection outline width and can be controlled by a QSlider. is it possible to increase the dotted selection width of the QGraphicsTextItem. i wanted to increase the pen thickness or size of the selection box coming around the text ..enter image description here

in the image a dotted lines bound the text . is it possible to increase the dotted line pen size or thickness.


Solution

  • This question is ancient, but I'll do my civic duty to try an answer:

    There are a few things you must do.

    1. Subclass your QGraphicsTextItem

    2. Override the paint method, and inside it remove the default selection style, and draw your own


    void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
    {
        QStyleOptionGraphicsItem opt(*option);
    
        // Remove the selection style state, to prevent the dotted line from being drawn.
        opt.state = QStyle::State_None;
    
        // Draw your fill on the item rectangle (or as big as you require) before drawing the text
        // This is where you can use your calculated values (as member variables) from what you did with the slider
        painter->setPen(Qt::NoPen);
        painter->setBrush(Qt::green);
        painter->drawRect(whateverRectangle());
    
        // Call the parent to do the actual text drawing 
        QGraphicsTextItem::paint(painter, &opt, widget);
    
        // You can use these to decide when you draw
        bool textEditingMode = (textInteractionFlags() & Qt::TextEditorInteraction);
        bool isSelected = (option->state & QStyle::State_Selected);
    
        // Draw your rectangle - can be different in selected mode or editing mode if you wish
    
        if (option->state & (QStyle::State_Selected))
        {
            // You can change pen thickness for the selection outline if you like
            painter->setPen(QPen(option->palette.windowText(), 0, Qt::DotLine)); 
            painter->setBrush(Qt::magenta);
            painter->drawRect(whateverRectangle());
        }
    }
    

    1. You may have to override the boundingRect, opaqueArea and shape functions to account for your increased size.