Russian Qt Forum
Апрель 20, 2024, 14:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать часть объекта QPainter невидимой?  (Прочитано 2971 раз)
Lenidoxll
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« : Январь 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);
}

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Январь 08, 2021, 14:20 »

Базовое понятие "регион". Не ручаюсь за точность (читал много лет назад) но примерно
Цитировать
Регион - это то что делит множество пыкселей экрана на 2 подмножества: те что входят в данный регион и те что нет. Все операции рисования не трогают пыксели что "не входют"
Как установить см

void QPainter::setClipRegion

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

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #2 : Январь 10, 2021, 20:58 »

Идея с QRegion и setClipRegion хорошая, спасибо за наводку! Однако возник тогда такой, казалось бы, глупый вопрос: когда я создаю QRegion типа эллипса, ну, то есть обычный кружок, выделяется и впоследствии стирается область вне круга. Из документации не очень понятно, как указать, чтобы выделялся регион не вне окружности, а как раз таки внутри. В интернете почему-то этот, как мне кажется, вполне естественный вопрос, тоже не разбирается, либо я плохо ищу, конечно. Возможно, Вы подскажите как быть?
Помимо прочего, как я понимаю, регион может быть также образован перекрытием двух областей и использованием одним из трех методов: xored, united, intersected. Однако и такими манипулированиями не получается вырезать область внутри! В том числе не получается и вырезать как бы колечко, бублик, образованный маленькой и большой окружностью, зато можно вырезать все вокруг Улыбающийся
И последний вопрос, ответ на который мне также найти самостоятельно не удалось: я правильно понимаю, что внутри большой окружности не получится вырезать только лишний кусок треугольника, а маленькую окружность оставить на месте?
Еще раз большое спасибо за ответ!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 11, 2021, 08:35 »

..не получается вырезать область внутри! В том числе не получается и вырезать как бы колечко, бублик, образованный маленькой и большой окружностью, зато можно вырезать все вокруг Улыбающийся
Должно получиться. Я бы делал по шагам

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

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

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

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

Идея с QRegion и setClipRegion хорошая..
Никаких идей я не генерировал, это классика рисования Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 22.