Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Lenidoxll от Январь 08, 2021, 13:21



Название: Как сделать часть объекта QPainter невидимой?
Отправлено: Lenidoxll от Январь 08, 2021, 13:21
Добрый день! Пытаюсь нарисовать картинку: две окружности, вложенные друг в друга, и треугольник, одна из вершин которого является центром этих двух окружностей. Хочется, чтобы та часть треугольника, которая как бы находится внутри окружностей, была бы невидимой. Подскажите, как добиться такого эффекта? ???  Через setCompositionMode, к сожалению, у меня не получилось.  :'( Возможно, задачу решить гораздо легче через QGraphicsItem. Заранее спасибо огромное за помощь!
h:
Код:
class SliderCrankLinkage : public QWidget
{
    Q_OBJECT
public:
    explicit SliderCrankLinkage(QWidget *parent = nullptr);
protected:
    void paintEvent(QPaintEvent* e);
};

срр:
Код:
void SliderCrankLinkage::paintEvent(QPaintEvent *e)
{
    Q_UNUSED(e);

    QPainter pbearing(this);
    pbearing.setPen(QPen(Qt::black, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    QLine AB(0, 0, 60, 0), BC(0, 0, 60, 0), CA(0, 0, 60, 0);

    QTransform transform;
    transform.translate(150, 150);
    pbearing.setWorldTransform(transform);
    pbearing.drawEllipse(-40, -40, 80, 80);
    pbearing.drawEllipse(-25, -25, 50, 50);
    transform.rotate(+60.0);
    pbearing.setWorldTransform(transform);
    pbearing.drawLine(AB);
    transform.rotate(+60.0);
    pbearing.setWorldTransform(transform);
    pbearing.drawLine(BC);
    transform.rotate(-60.0);
    transform.translate(60.0, 0);
    transform.rotate(+120.0);
    pbearing.setWorldTransform(transform);
    pbearing.drawLine(CA);
    transform.translate(30.0, 0);
    pbearing.setWorldTransform(transform);
    pbearing.drawLine(50, 0, -50, 0);
    pbearing.setPen(Qt::NoPen);
    pbearing.setBrush(QBrush(Qt::black, Qt::BDiagPattern));
    pbearing.drawRect(50, 0, -100, -25);
}



Название: Re: Как сделать часть объекта QPainter невидимой?
Отправлено: Igors от Январь 08, 2021, 14:20
Базовое понятие "регион". Не ручаюсь за точность (читал много лет назад) но примерно
Цитировать
Регион - это то что делит множество пыкселей экрана на 2 подмножества: те что входят в данный регион и те что нет. Все операции рисования не трогают пыксели что "не входют"
Как установить см

void QPainter::setClipRegion

Как "изготовить" регион - разберетесь, "круглый" регион точно есть (как и его инверсия)


Название: Re: Как сделать часть объекта QPainter невидимой?
Отправлено: Lenidoxll от Январь 10, 2021, 20:58
Идея с QRegion и setClipRegion хорошая, спасибо за наводку! Однако возник тогда такой, казалось бы, глупый вопрос: когда я создаю QRegion типа эллипса, ну, то есть обычный кружок, выделяется и впоследствии стирается область вне круга. Из документации не очень понятно, как указать, чтобы выделялся регион не вне окружности, а как раз таки внутри. В интернете почему-то этот, как мне кажется, вполне естественный вопрос, тоже не разбирается, либо я плохо ищу, конечно. Возможно, Вы подскажите как быть?
Помимо прочего, как я понимаю, регион может быть также образован перекрытием двух областей и использованием одним из трех методов: xored, united, intersected. Однако и такими манипулированиями не получается вырезать область внутри! В том числе не получается и вырезать как бы колечко, бублик, образованный маленькой и большой окружностью, зато можно вырезать все вокруг :)
И последний вопрос, ответ на который мне также найти самостоятельно не удалось: я правильно понимаю, что внутри большой окружности не получится вырезать только лишний кусок треугольника, а маленькую окружность оставить на месте?
Еще раз большое спасибо за ответ!


Название: Re: Как сделать часть объекта QPainter невидимой?
Отправлено: Igors от Январь 11, 2021, 08:35
..не получается вырезать область внутри! В том числе не получается и вырезать как бы колечко, бублик, образованный маленькой и большой окружностью, зато можно вырезать все вокруг :)
Должно получиться. Я бы делал по шагам

- создал круглый регион, залил все окно цветом. Если регион правильно создан и установлен - заливается  только круг

- создал меньший круг, опять проверил

- сделал хor двух кругов, теперь заливается "бублик"

- ну и xor бублика с прямоугольным регионом окна - заливается все кроме бублика
 
..я правильно понимаю, что внутри большой окружности не получится вырезать только лишний кусок треугольника, а маленькую окружность оставить на месте?
Я не обладаю таким пространственным воображением чтобы понять что Вы хотите  :) Надеюсь вопрос отпадет сам собой когда разберетесь с бубликом, иначе покажите на картинке

Идея с QRegion и setClipRegion хорошая..
Никаких идей я не генерировал, это классика рисования :)