Как нарисовать половину пирога в QGraphicsItem

Я пытаюсь нарисовать половину пирога вот так в фреймворке qGraphicsview. введите описание изображения здесь

И я попытался нарисовать два пирога, цвет одного из них прозрачный, но это не сработало, и я решил спросить здесь.

Поскольку я не очень хорошо знаю QPainterPath, мне не удалось нарисовать дугу и круговую диаграмму !.

Любой ответ oridea будет оценен.


person ibrahimyilmaz    schedule 24.01.2012    source источник
comment
мне кажется бритой шишкой :). Не могли бы вы опубликовать код, который вы пробовали?   -  person Neox    schedule 24.01.2012
comment
Тебе удалось хоть что-нибудь нарисовать?   -  person jdi    schedule 16.03.2012


Ответы (2)


Согласен с Neox, картинка не совсем пирог;). Если вам нужен настоящий пирог (то есть сегмент круга), вы можете использовать встроенный метод painter:

QRect rect( -radius, -radius, radius*2, radius*2);
painter->drawPie( rect, startAngle*16, span*16 );

int radius Очевидно, радиус вашего пирога.

int startAngle
где начинается ваш пирог, например Смещение 20 ° от положительной оси X

int span
количество градусов, на которое растягивается дуга, например круговая диаграмма с размахом = 320 ° будет заканчиваться в сумме на 340 ° или -20 ° от положительной оси X. (см. Документацию QPainter для чудесного * 16)

Это должно дать вам хороший PacMan ^^ - или вы можете поэкспериментировать со значениями.

Теперь, без каких-либо подробностей, вам нужно выяснить, где на самом деле разместить этот фрагмент. Естественно, это может быть метод рисования какого-либо графического элемента, например настраиваемый QGraphicsItem и, следовательно, использовать рисовальщик, который поступает в качестве входных данных в этот метод. Это действительно зависит от ваших настроек виджетов и прочего ...

У Qt на самом деле довольно классная документация, поэтому сначала обязательно ознакомьтесь с этим: (Я сам занимался этим всего две недели, но вы можете довольно далеко продвинуться с документацией)

QGraphicsItem: http://qt-project.org/doc/qt-4.8/qgraphicsitem.html
QPainter: http://qt-project.org/doc/qt-4.8/qpainter.html

Привет, Луиза

PS: Первый ответ, ура!

person Louise    schedule 16.03.2012
comment
И как только вам удалось правильно нарисовать срез круговой диаграммы, вы можете впоследствии покрасить версию с меньшим радиусом прозрачным цветом Qt., чтобы сбрить область в направлении начала круга. - person jdi; 16.03.2012

Стирание нецелесообразно, потому что очень скоро вы будете стирать другие элементы изображения или, по крайней мере, вам нужно быть очень осторожным в том, в каком порядке вы их рисуете.

Буквально, если вы ищете способ нарисовать пирог, метод drawPie () сделает это, но, глядя на приведенный вами пример изображения, вы ищете сегмент шайбы, похожий на пирог.

Что-то вроде этого:

введите описание изображения здесь

Это было создано с помощью такого кода:

QImage image(width,height,QImage::Format_ARGB32); 
image.fill(qRgba(0,0,0,0)); // clear and make transparent

QPainter painter; // use a painter to draw to the image
painter.begin(&image);

// center at (0,0) and scale so that range [-1,1] cover whole image
QTransform transform;
transform.translate(texSize/2, texSize/2);
transform.scale(texSize/2, -texSize/2);
painter.setTransform(transform);

// outer and inner washer dimensions
QRectF r1(-1, -1, 2, 2);
QRectF r2(-0.5, -0.5, 1, 1);

//-------------- this is the essence of the matter -------------
// create a path with two arcs to form the outline
QPainterPath path;
path.arcTo(r1,0,90);  // from 3 'clock 90 degrees cw
path.arcTo(r2,90,-90); // from 12 'clock 90 degrees ccw
//--------------------------------------------------------------

// and finally fill it
painter.fillPath(path, Qt::green);

// save it to file
image.save(QLatin1String("testimage.png"));

Вышеупомянутое не работает с QGraphicsItem. Однако я считаю, что вы должны сделать этот QGraphicsPathItem и поднять код сверху, чтобы создать путь.

Я не хотел публиковать код, который использует QGraphicsPathItem, потому что у меня нет времени проверить этот код, но я считаю, что приведенный выше фрагмент кода решает существенную трудность, связанную с созданием геометрии в первую очередь.

person nyholku    schedule 12.02.2017