Как мне управлять отсечкой с помощью непрозрачных графических элементов в Qt? - PullRequest
0 голосов
/ 30 октября 2009

У меня есть несколько QGraphicsSvgItem's в QGraphicsScene, которые нарисованы соединенными QGraphicsLineItem's. Это шоу представляет собой график древовидной структуры.

Что я хочу сделать, так это предоставить функцию, при которой все, кроме выбранного поддерева, становится прозрачным. Этакая функция «выделить это поддерево». Эта часть была легкой, но результаты уродливы, потому что теперь линии можно увидеть через полупрозрачные svg.

Я ищу способ по-прежнему закреплять другие объекты QGraphicsItem в сцене на элементах svg, давая эффект, что svg являются полупрозрачными окнами для фона.

Я знаю, что этот код не использует svg, но я полагаю, что вы можете заменить его самостоятельно, если вы так склонны.

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QGraphicsScene scene;
    for( int i = 0; i < 10; ++i ) {
        QGraphicsLineItem* line = new QGraphicsLineItem;
        line->setLine( i * 25.0 + 1.0, 0, i * 25.0 + 23.0, 0 );
        scene.addItem( line );
    }

    for( int i = 0; i < 11; ++i ) {
        QGraphicsEllipseItem* ellipse = new QGraphicsEllipseItem;
        ellipse->setRect( (i * 25.0) - 9.0, -9.0, 18.0, 18.0f );
        ellipse->setBrush( QBrush( Qt::green, Qt::SolidPattern ) );
        ellipse->setOpacity( 0.5 );
        scene.addItem( ellipse );
    }
    QGraphicsView view( &scene );
    view.show();
    return app.exec();
}

Я бы хотел, чтобы линии не были видны за кругом. Я попытался поработать с буфером глубины и буфером трафарета, используя рендеринг opengl, но безрезультатно.

Как получить QGraphicsSvgItem (или QGraphicsEllipseItem в коде примера) для обрезания строк, даже если они полупрозрачны?

1 Ответ

0 голосов
/ 30 октября 2009

Лучшим решением здесь является создание подкласса QGraphicsScene и ваших графических элементов.
Создайте другой класс для сцены и несколько классов для разных графических элементов. Затем у вас будет метод рисования для каждого элемента, где вы можете рисовать с непрозрачностью, которая вам требуется.
В этом случае вы сможете решить проблему отсечения также потому, что у вас будет контроль над формой и ограничительным прямоугольником для каждого элемента.
Еще одна полезная функция - возможность связывать элементы в вашей реализации, чтобы при щелчке куда-то можно было настроить параметры видимости сразу для нескольких элементов.
Другими словами, у вас будет больше контроля над всей сценой, и, следовательно, изучение и написание этих подклассов - это хорошее вложение времени.
Например, вы можете увидеть Пример столкнувшихся мышей , где нарисованы пользовательские графические элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...