Как добавить схему в qgraphicslineitem?

Я хочу иметь QGraphicsLineItem, где он выделен определенным цветом.

Я пробовал использовать

QGraphicsLineItem::setColor(QColor(...))

Однако это только закрашивает изнутри.

Какую функцию я должен вызвать, чтобы создать схему?

Если быть более конкретным, допустим, это обычный QGraphicsLineItem

--------------------------------------
    10px
    green QGraphicsLineItem
--------------------------------------

Мне нужен совершенно другой (сплошной) цвет за пределами границ, вот так,

--------------------------------------
2px blue 
--------------------------------------
10px
green
--------------------------------------
2px blue
--------------------------------------

Так что эффект тени не будет работать, надеюсь, это ясно.

Вы можете проиллюстрировать то, что хотите, изображением.

eyllanesc 13.09.2018 21:23

... плюс вы можете взглянуть на QGraphicsDropShadowEffect.

scopchanov 13.09.2018 21:24

@eyllanesc - Я добавил изображение, которое, надеюсь, проясняет.

qtquestionstack 13.09.2018 21:42
1
3
427
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Решение 1

Один из способов добавить схему к QGraphicsLineItem - использовать QGraphicsDropShadowEffect с нулевым смещением.

Примечание: Этот подход не требует создания подклассов, но он не такой надежный, так как не позволяет точно установить тиканность и контур не является твердым. Однако в некоторых случаях это может работать нормально.

Вот пример того, как это сделать:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    auto *view = new QGraphicsView(this);
    auto *item = new QGraphicsLineItem(50, 50, 250, 150);
    auto *effect = new QGraphicsDropShadowEffect(this);

    effect->setColor(Qt::blue);
    effect->setOffset(0);
    effect->setBlurRadius(10);

    item->setPen(QPen(Qt::green, 10));
    item->setGraphicsEffect(effect);

    view->setScene(new QGraphicsScene(this));
    view->scene()->addItem(item);

    setCentralWidget(view);
    resize(300, 200);
}

Этот пример дает следующий результат:

Window with a thick green line with a glowing blue outline

Большое спасибо за ваш ответ, это не совсем то, что я ищу, я уточню в посте.

qtquestionstack 13.09.2018 21:39

Большое спасибо за Вашу помощь

qtquestionstack 13.09.2018 22:08

@qtquestionstack, теперь все в порядке? Скажите, хотите ли вы, чтобы это было исправлено.

scopchanov 13.09.2018 22:10
Ответ принят как подходящий

Решение 2

Другой способ добавить схему - использовать QPainter :: strokePath. Для этого вам нужно создать подкласс QGraphicsLineItem и заново реализовать метод paint.

Примечание: Этот подход более сложен, поскольку он требует создания подклассов, но он дает больше свободы, включая установку штрихов и цвета контура.

Вот пример того, как это сделать:

void OutLineItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QPainterPath outline;

    outline.moveTo(line().p1());
    outline.lineTo(line().p2());

    painter->save();
    painter->setRenderHint(QPainter::Antialiasing);
    painter->strokePath(outline, QPen(m_outlineColor, 2*m_outlineWidth + pen().width()));
    painter->setPen(pen());
    painter->drawLine(line());
    painter->restore();
}

Полный код примера, который я подготовил для вас, доступен на GitHub.

Этот пример дает следующий результат:

Window with a thick green line with a solid blue outline

Другие вопросы по теме