Как видно из заголовка, я ищу способ закрасить подпути QPainterPath разными цветами, который применяется к QGraphicsPathItem, ИЛИ просто изменить цвет вдоль PathItem с помощью QGradient QPen.
В конечном итоге я пытаюсь найти правильное решение, которое даст мне возможность визуально нарисовать одну линию, которая меняет цвета в зависимости от внешних переменных.
Я использую QGraphicsScene, чтобы нарисовать все.
В моем текущем решении я создал несколько QGraphicsPathItems, каждый из которых по-разному окрашен соответствующими QPens. Когда я получаю данные, я заполняю PainterPath, связанный с этими PathItems. Это дает мне разноцветные линии, которые мне нужны, но линии явно отключены.
Мне нужно либо иметь возможность сделать невидимые подпути QPainterPath во время изменения цвета, либо изменить градиент, примененный к одному PathItem. Или, может быть, есть другой подход, который мне не хватает.
Любая помощь будет замечательной.
-Редактировать:
Вот как я сейчас рисую, как отмечалось в решении моего вопроса. Опять же, обратите внимание, что я использую GraphicsScene.
Расчет формулы подшипника в GraphicsScene приводит к ошибочным результатам
Как вы можете видеть, линия меняет цвет, как она нарисована, внешними переменными. Боюсь, что Qgradient может не работать, потому что линия не всегда будет прямой; цвет должен течь вдоль линии.
Вот что происходит:
Как видите, красная линия (PathItem) прыгает с того места, где она в последний раз была видна, на новую позицию.
Чтобы лучше понять поведение, представьте, что эта линия проводится со временем. Он начинается красным, вскоре устанавливается переменная, а цвет нарисованных отрезков линий меняется на оранжевый. Красные части линии остаются нетронутыми, поэтому мы можем исторически увидеть, каково было состояние переменной в то время. В разное время переменная корректируется, и цвет, применяемый к новым частям строки, обновляется соответствующим образом.
Когда линия закончила рисовать, мы можем посмотреть на нее и посмотреть, когда цвета изменились.
Я надеюсь, что все это имеет смысл.
Вы можете использовать несколько QPainterPath
по одному на каждый цвет. А затем покрасьте их в нужный цвет. Обязательно используйте moveTo()
переместить курсор текущего пути без рисования линии.
void Widget::paintEvent(QPaintEvent *event)
{
QPainterPath redPath;
QPainterPath bluePath;
redPath.moveTo(0,0);
redPath.lineTo(60,60);
bluePath.moveTo(60,60);
bluePath.lineTo(70,20);
redPath.moveTo(70,20);
redPath.lineTo(100,100);
bluePath.moveTo(100,100);
bluePath.lineTo(160,260);QPainter painter(this);
painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
painter.setPen(QPen(Qt::red, 4));
painter.drawPath(redPath);
painter.setPen(QPen(Qt::blue, 4));
painter.drawPath(bluePath);
}
Если вы чувствуете, что вызовы «moveTo» и «lineTo» немного тяжелы, вы можете инкапсулировать все QPainterPaths в вашем собственном классе с помощью lineTo(QPointF, QColor)
функция, которая будет обрабатывать переключение пути при изменении цвета.
Других решений пока нет …