페인터 경로 예제
페인터 경로 예제는 페인터 경로를 사용하여 렌더링할 복잡한 모양을 만드는 방법을 보여줍니다.
QPainterPath 클래스는 페인팅 작업을 위한 컨테이너를 제공하여 그래픽 모양을 만들고 재사용할 수 있도록 합니다.
페인터 경로는 여러 그래픽 빌딩 블록(예: 직사각형, 타원, 선, 곡선)으로 구성된 객체이며 채우기, 윤곽선 그리기 및 클리핑에 사용할 수 있습니다. 일반 그리기 작업에 비해 페인터 경로의 가장 큰 장점은 복잡한 모양을 한 번만 만들면 되지만 QPainter::drawPath() 호출만으로 여러 번 그릴 수 있다는 것입니다.
이 예제는 두 개의 클래스로 구성되어 있습니다:
RenderArea
클래스는 단일 페인터 경로를 표시하는 사용자 정의 위젯입니다.Window
클래스는 여러 개의RenderArea
위젯을 표시하고 사용자가 페인터 경로의 채우기, 펜, 색상 및 회전 각도를 조작할 수 있는 애플리케이션 메인 창입니다.
먼저 Window
클래스를 살펴본 다음 RenderArea
클래스를 살펴보겠습니다.
창 클래스 정의
Window
클래스는 QWidget 을 상속하며, 여러 개의 RenderArea
위젯을 표시하고 사용자가 페인터 경로의 채우기, 펜, 색상 및 회전 각도를 조작할 수 있는 애플리케이션의 메인 창입니다.
class Window : public QWidget { Q_OBJECT public: Window(); private slots: void fillRuleChanged(); void fillGradientChanged(); void penColorChanged();
채우기 및 색상에 관한 사용자 입력에 응답하기 위해 fillRuleChanged()
, fillGradientChanged()
및 penColorChanged()
의 세 개의 비공개 슬롯을 선언합니다.
사용자가 펜 너비와 회전 각도를 변경하면 QSpinBox::valueChanged() 신호를 사용하여 새 값이 RenderArea
위젯에 직접 전달됩니다. 채우기 및 색상을 업데이트하기 위해 슬롯을 구현해야 하는 이유는 QComboBox 에는 새 값을 인수로 전달하는 유사한 신호가 제공되지 않기 때문에 RenderArea
위젯을 업데이트하기 전에 새 값을 검색해야 하기 때문입니다.
private: void populateWithColors(QComboBox *comboBox); QVariant currentItemData(QComboBox *comboBox);
또한 몇 가지 개인 편의 함수를 선언합니다: populateWithColors()
은 주어진 QComboBox 을 Qt가 알고 있는 색상 이름에 해당하는 항목으로 채우고, currentItemData()
은 주어진 QComboBox 에 대한 현재 항목을 반환합니다.
QList<RenderArea*> renderAreas; QLabel *fillRuleLabel; QLabel *fillGradientLabel; QLabel *fillToLabel; QLabel *penWidthLabel; QLabel *penColorLabel; QLabel *rotationAngleLabel; QComboBox *fillRuleComboBox; QComboBox *fillColor1ComboBox; QComboBox *fillColor2ComboBox; QSpinBox *penWidthSpinBox; QComboBox *penColorComboBox; QSpinBox *rotationAngleSpinBox; };
그런 다음 메인 창 위젯의 다양한 컴포넌트를 선언합니다. 또한 RenderArea
위젯의 수를 지정하는 편의 상수도 선언합니다.
창 클래스 구현
Window
생성자에서 다양한 페인터 경로를 정의하고 그래픽 모양을 렌더링할 해당 RenderArea
위젯을 생성합니다:
Window::Window() { QPainterPath rectPath; rectPath.moveTo(20.0, 30.0); rectPath.lineTo(80.0, 30.0); rectPath.lineTo(80.0, 70.0); rectPath.lineTo(20.0, 70.0); rectPath.closeSubpath();
QPainterPath::moveTo() 및 QPainterPath::lineTo() 함수를 사용하여 날카로운 모서리를 가진 직사각형을 만듭니다.
QPainterPath::moveTo() 함수는 현재 지점을 인수로 전달된 지점으로 이동합니다. 페인터 경로는 여러 그래픽 빌딩 블록, 즉 하위 경로로 구성된 객체입니다. 현재 점을 이동하면 새 하위 경로도 시작됩니다(새 경로가 시작되면 이전 경로가 암시적으로 닫힘). QPainterPath::lineTo () 함수는 현재 지점에서 지정된 끝점까지 직선을 추가합니다. 선이 그려지면 현재 지점이 선의 끝점에 위치하도록 업데이트됩니다.
먼저 새 하위 경로를 시작하여 현재 점을 이동하고 직사각형의 세 변을 그립니다. 그런 다음 QPainterPath::closeSubpath() 함수를 호출하여 현재 하위 경로의 시작점에 선을 그립니다. 현재 하위 경로가 닫히면 새 하위 경로가 자동으로 시작됩니다. 새 경로의 현재 지점은 (0, 0)입니다. QPainterPath::lineTo ()를 호출하여 마지막 선을 그린 다음 QPainterPath::moveTo() 함수를 사용하여 명시적으로 새 하위 경로를 시작할 수도 있습니다.
QPainterPath 또한 QPainterPath::addRect() 함수는 경로에 주어진 직사각형을 닫힌 하위 경로로 추가하는 편의 기능을 제공합니다. 직사각형은 시계 방향의 선 집합으로 추가됩니다. 직사각형이 추가된 후 페인터 경로의 현재 위치는 직사각형의 왼쪽 상단 모서리에 있습니다.
QPainterPath roundRectPath; roundRectPath.moveTo(80.0, 35.0); roundRectPath.arcTo(70.0, 30.0, 10.0, 10.0, 0.0, 90.0); roundRectPath.lineTo(25.0, 30.0); roundRectPath.arcTo(20.0, 30.0, 10.0, 10.0, 90.0, 90.0); roundRectPath.lineTo(20.0, 65.0); roundRectPath.arcTo(20.0, 60.0, 10.0, 10.0, 180.0, 90.0); roundRectPath.lineTo(75.0, 70.0); roundRectPath.arcTo(70.0, 60.0, 10.0, 10.0, 270.0, 90.0); roundRectPath.closeSubpath();
그런 다음 모서리가 둥근 직사각형을 만듭니다. 이전과 마찬가지로 QPainterPath::moveTo() 및 QPainterPath::lineTo() 함수를 사용하여 직사각형의 변을 그립니다. 둥근 모서리를 만들기 위해 QPainterPath::arcTo() 함수를 사용합니다.
QPainterPath::arcTo()는 주어진 직사각형( QRect 또는 직사각형의 좌표로 지정)을 차지하는 호를 만들어 주어진 시작 각도에서 시작하여 시계 반대 방향으로 지정된 각도만큼 확장합니다. 각도는 도 단위로 지정합니다. 시계 방향 호는 음의 각도를 사용하여 지정할 수 있습니다. 이 함수는 현재 지점과 호의 시작 지점이 아직 연결되어 있지 않은 경우 현재 지점을 호의 시작 지점에 연결합니다.
QPainterPath ellipsePath; ellipsePath.moveTo(80.0, 50.0); ellipsePath.arcTo(20.0, 30.0, 60.0, 40.0, 0.0, 360.0);
또한 QPainterPath::arcTo() 함수를 사용하여 타원 경로를 구성합니다. 먼저 현재 점을 새 경로의 시작점으로 이동합니다. 그런 다음 시작 각도 0.0과 360.0도를 마지막 인수로 사용하여 QPainterPath::arcTo()를 호출하여 타원을 만듭니다.
다시, QPainterPath 는 주어진 경계 사각형 내에 타원을 생성하여 페인터 경로에 추가하는 편의 함수( QPainterPath::addEllipse())를 제공합니다. 현재 하위 경로가 닫히면 새 하위 경로가 시작됩니다. 타원은 0도(3시 위치)에서 시작하고 끝나는 시계 방향 곡선으로 구성됩니다.
QPainterPath piePath; piePath.moveTo(50.0, 50.0); piePath.arcTo(20.0, 30.0, 60.0, 40.0, 60.0, 240.0); piePath.closeSubpath();
파이 차트 경로를 구성할 때는 앞서 언급한 함수의 조합을 계속 사용합니다: 먼저 현재 지점을 이동하여 새 하위 경로를 시작합니다. 그런 다음 차트 중앙에서 호까지 선과 호 자체를 만듭니다. 하위 경로를 닫으면 암시적으로 마지막 선을 차트 중앙으로 다시 구성합니다.
QPainterPath polygonPath; polygonPath.moveTo(10.0, 80.0); polygonPath.lineTo(20.0, 10.0); polygonPath.lineTo(80.0, 30.0); polygonPath.lineTo(90.0, 70.0); polygonPath.closeSubpath();
다각형을 만드는 것은 직사각형을 만드는 것과 같습니다.
QPainterPath 또한 지정된 다각형을 새로운 하위 경로로 경로에 추가하는 QPainterPath::addPolygon() 편의 함수를 제공합니다. 다각형이 추가된 후의 현재 위치는 다각형의 마지막 점입니다.
QPainterPath groupPath; groupPath.moveTo(60.0, 40.0); groupPath.arcTo(20.0, 20.0, 40.0, 40.0, 0.0, 360.0); groupPath.moveTo(40.0, 40.0); groupPath.lineTo(40.0, 80.0); groupPath.lineTo(80.0, 80.0); groupPath.lineTo(80.0, 40.0); groupPath.closeSubpath();
그런 다음 하위 경로 그룹으로 구성된 경로를 만듭니다: 먼저 현재 점을 이동하고 타원 경로를 만들 때와 마찬가지로 시작 각도가 0.0이고 마지막 인수가 360도인 QPainterPath::arcTo() 함수를 사용하여 원을 만듭니다. 그런 다음 현재 점을 다시 이동하여 새 하위 경로를 시작하고 QPainterPath::lineTo() 함수를 사용하여 사각형의 세 변을 만듭니다.
이제 QPainterPath::closeSubpath() 함수를 호출하면 마지막 변이 만들어집니다. QPainterPath::closeSubpath () 함수는 현재 하위 경로의 시작점, 즉 정사각형에 선을 그린다는 것을 기억하세요.
QPainterPath 함수를 호출하는 경로에 지정된 경로를 추가하는 편의 함수 QPainterPath::addPath()를 제공합니다.
QPainterPath textPath; QFont timesFont("Times", 50); timesFont.setStyleStrategy(QFont::ForceOutline); textPath.addText(10, 70, timesFont, tr("Qt"));
텍스트 경로를 만들 때는 먼저 글꼴을 만듭니다. 그런 다음 글꼴의 스타일 전략을 설정하여 글꼴 매칭 알고리즘에 적절한 기본 글꼴 패밀리를 찾기 위해 어떤 유형의 글꼴을 사용해야 하는지 알려줍니다. QFont::ForceOutline 은 윤곽선 글꼴을 사용하도록 강제합니다.
텍스트를 구성하기 위해 QPainterPath::addText() 함수를 사용하여 제공된 글꼴에서 생성된 닫힌 하위 경로 집합으로 경로에 주어진 텍스트를 추가합니다. 하위 경로는 텍스트 기준선의 왼쪽 끝이 지정된 지점에 위치하도록 배치됩니다.
QPainterPath bezierPath; bezierPath.moveTo(20, 30); bezierPath.cubicTo(80, 0, 50, 50, 80, 80);
베지어 경로를 생성하려면 현재 지점과 지정된 끝점 사이에 지정된 제어점을 가진 베지어 곡선을 추가하는 QPainterPath::cubicTo() 함수를 사용합니다. 커브가 추가되면 현재 점이 커브의 끝점에 위치하도록 업데이트됩니다.
이 경우 하위 경로를 닫는 것을 생략하여 단순한 커브만 남습니다. 그러나 커브의 끝점에서 하위 경로의 시작점으로 돌아가는 논리적 선이 여전히 존재하며, 애플리케이션 메인 창에서 볼 수 있듯이 경로를 채울 때 이 선이 표시됩니다.
QPainterPath starPath; starPath.moveTo(90, 50); for (int i = 1; i < 5; ++i) { starPath.lineTo(50 + 40 * std::cos(0.8 * i * M_PI), 50 + 40 * std::sin(0.8 * i * M_PI)); } starPath.closeSubpath();
우리가 구성한 최종 경로는 QPainterPath 를 사용하여 앞서 언급한 QPainterPath::moveTo(), QPainterPath::lineTo() 및 QPainterPath::closeSubpath() 함수만 사용하여 다소 복잡한 모양을 구성할 수 있음을 보여줍니다.
renderAreas.push_back(new RenderArea(rectPath)); renderAreas.push_back(new RenderArea(roundRectPath)); renderAreas.push_back(new RenderArea(ellipsePath)); renderAreas.push_back(new RenderArea(piePath)); renderAreas.push_back(new RenderArea(polygonPath)); renderAreas.push_back(new RenderArea(groupPath)); renderAreas.push_back(new RenderArea(textPath)); renderAreas.push_back(new RenderArea(bezierPath)); renderAreas.push_back(new RenderArea(starPath));
이제 필요한 모든 페인터 경로를 만들었으므로 각각에 해당하는 RenderArea
위젯을 만듭니다. 마지막으로 Q_ASSERT() 매크로를 사용하여 렌더링 영역의 수가 올바른지 확인합니다.
fillRuleComboBox = new QComboBox; fillRuleComboBox->addItem(tr("Odd Even"), Qt::OddEvenFill); fillRuleComboBox->addItem(tr("Winding"), Qt::WindingFill); fillRuleLabel = new QLabel(tr("Fill &Rule:")); fillRuleLabel->setBuddy(fillRuleComboBox);
그런 다음 페인터 경로의 채우기 규칙과 관련된 위젯을 만듭니다.
Qt에는 두 가지 채우기 규칙을 사용할 수 있습니다: Qt::OddEvenFill 규칙은 점에서 도형 외부의 위치까지 수평선을 그려서 점이 도형 내부에 있는지 여부를 결정하고 교차하는 개수를 계산합니다. 교차점의 수가 홀수이면 점이 도형 내부에 있는 것입니다. 이 규칙이 기본값입니다.
Qt::WindingFill 규칙은 점에서 도형 외부의 위치까지 수평선을 그려 점이 도형 내부에 있는지 여부를 결정합니다. 그런 다음 각 교차점에서 선의 방향이 위쪽인지 아래쪽인지 결정합니다. 와인딩 수는 각 교차점의 방향을 합산하여 결정됩니다. 숫자가 0이 아닌 경우 해당 지점은 도형 내부에 있습니다.
Qt::WindingFill 규칙은 대부분의 경우 닫힌 도형의 교집합으로 간주할 수 있습니다.
fillColor1ComboBox = new QComboBox; populateWithColors(fillColor1ComboBox); fillColor1ComboBox->setCurrentIndex(fillColor1ComboBox->findText("mediumslateblue")); fillColor2ComboBox = new QComboBox; populateWithColors(fillColor2ComboBox); fillColor2ComboBox->setCurrentIndex(fillColor2ComboBox->findText("cornsilk")); fillGradientLabel = new QLabel(tr("&Fill Gradient:")); fillGradientLabel->setBuddy(fillColor1ComboBox); fillToLabel = new QLabel(tr("to")); fillToLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); penWidthSpinBox = new QSpinBox; penWidthSpinBox->setRange(0, 20); penWidthLabel = new QLabel(tr("&Pen Width:")); penWidthLabel->setBuddy(penWidthSpinBox); penColorComboBox = new QComboBox; populateWithColors(penColorComboBox); penColorComboBox->setCurrentIndex(penColorComboBox->findText("darkslateblue")); penColorLabel = new QLabel(tr("Pen &Color:")); penColorLabel->setBuddy(penColorComboBox); rotationAngleSpinBox = new QSpinBox; rotationAngleSpinBox->setRange(0, 359); rotationAngleSpinBox->setWrapping(true); rotationAngleSpinBox->setSuffix(QLatin1String("\xB0")); rotationAngleLabel = new QLabel(tr("&Rotation Angle:")); rotationAngleLabel->setBuddy(rotationAngleSpinBox);
채우기, 펜 및 회전 각도와 관련된 다른 위젯도 만듭니다.
connect(fillRuleComboBox, &QComboBox::activated, this, &Window::fillRuleChanged); connect(fillColor1ComboBox, &QComboBox::activated, this, &Window::fillGradientChanged); connect(fillColor2ComboBox, &QComboBox::activated, this, &Window::fillGradientChanged); connect(penColorComboBox, &QComboBox::activated, this, &Window::penColorChanged); for (RenderArea *area : std::as_const(renderAreas)) { connect(penWidthSpinBox, &QSpinBox::valueChanged, area, &RenderArea::setPenWidth); connect(rotationAngleSpinBox, &QSpinBox::valueChanged, area, &RenderArea::setRotationAngle); }
콤보박스 activated() 신호를 Window
클래스의 관련 슬롯에 연결하고, 스핀박스 valueChanged() 신호를 RenderArea
위젯의 각 슬롯에 직접 연결합니다.
QGridLayout *topLayout = new QGridLayout; int i = 0; for (RenderArea *area : std::as_const(renderAreas)) { topLayout->addWidget(area, i / 3, i % 3); ++i; } QGridLayout *mainLayout = new QGridLayout; mainLayout->addLayout(topLayout, 0, 0, 1, 4); mainLayout->addWidget(fillRuleLabel, 1, 0); mainLayout->addWidget(fillRuleComboBox, 1, 1, 1, 3); mainLayout->addWidget(fillGradientLabel, 2, 0); mainLayout->addWidget(fillColor1ComboBox, 2, 1); mainLayout->addWidget(fillToLabel, 2, 2); mainLayout->addWidget(fillColor2ComboBox, 2, 3); mainLayout->addWidget(penWidthLabel, 3, 0); mainLayout->addWidget(penWidthSpinBox, 3, 1, 1, 3); mainLayout->addWidget(penColorLabel, 4, 0); mainLayout->addWidget(penColorComboBox, 4, 1, 1, 3); mainLayout->addWidget(rotationAngleLabel, 5, 0); mainLayout->addWidget(rotationAngleSpinBox, 5, 1, 1, 3); setLayout(mainLayout);
RenderArea
위젯을 별도의 레이아웃에 추가한 다음 나머지 위젯과 함께 메인 레이아웃에 추가합니다.
fillRuleChanged(); fillGradientChanged(); penColorChanged(); penWidthSpinBox->setValue(2); setWindowTitle(tr("Painter Paths")); }
마지막으로 fillRuleChanged()
, fillGradientChanged()
및 penColorChanged()
슬롯을 호출하여 RenderArea
위젯을 초기화하고 초기 펜 너비와 창 제목을 설정합니다.
void Window::fillRuleChanged() { Qt::FillRule rule = (Qt::FillRule)currentItemData(fillRuleComboBox).toInt(); for (RenderArea *area : std::as_const(renderAreas)) area->setFillRule(rule); } void Window::fillGradientChanged() { QColor color1 = qvariant_cast<QColor>(currentItemData(fillColor1ComboBox)); QColor color2 = qvariant_cast<QColor>(currentItemData(fillColor2ComboBox)); for (RenderArea *area : std::as_const(renderAreas)) area->setFillGradient(color1, color2); } void Window::penColorChanged() { QColor color = qvariant_cast<QColor>(currentItemData(penColorComboBox)); for (RenderArea *area : std::as_const(renderAreas)) area->setPenColor(color); }
비공개 슬롯은 연결된 콤보박스에서 새 값을 검색하고 RenderArea 위젯을 업데이트하기 위해 구현됩니다.
먼저 비공개 currentItemData()
함수와 qvariant_cast() 템플릿 함수를 사용하여 새 값을 결정합니다. 그런 다음 각 RenderArea
위젯에 연결된 슬롯을 호출하여 페인터 경로를 업데이트합니다.
void Window::populateWithColors(QComboBox *comboBox) { const QStringList colorNames = QColor::colorNames(); for (const QString &name : colorNames) comboBox->addItem(name, QColor(name)); }
populateWithColors()
함수는 정적 QColor::colorNames() 함수가 제공하는 색상 이름에 해당하는 항목으로 주어진 콤보박스를 채웁니다.
QVariant Window::currentItemData(QComboBox *comboBox) { return comboBox->itemData(comboBox->currentIndex()); }
currentItemData()
함수는 단순히 주어진 콤보박스의 현재 항목을 반환합니다.
RenderArea 클래스 정의
RenderArea
클래스는 QWidget 을 상속하며 단일 페인터 경로를 표시하는 사용자 정의 위젯입니다.
class RenderArea : public QWidget { Q_OBJECT public: explicit RenderArea(const QPainterPath &path, QWidget *parent = nullptr); QSize minimumSizeHint() const override; QSize sizeHint() const override; public slots: void setFillRule(Qt::FillRule rule); void setFillGradient(const QColor &color1, const QColor &color2); void setPenWidth(int width); void setPenColor(const QColor &color); void setRotationAngle(int degrees); protected: void paintEvent(QPaintEvent *event) override;
RenderArea
위젯의 관련 페인터 경로를 업데이트하는 여러 개의 공개 슬롯을 선언합니다. 또한 QWidget::minimumSizeHint() 및 QWidget::sizeHint() 함수를 재구현하여 애플리케이션 내에서 RenderArea
위젯의 크기를 적절하게 조정하고 QWidget::paintEvent() 이벤트 핸들러를 재구현하여 해당 페인터 경로를 그립니다.
private: QPainterPath path; QColor fillColor1; QColor fillColor2; int penWidth; QColor penColor; int rotationAngle; };
RenderArea
클래스의 각 인스턴스에는 QPainterPath, 몇 가지 채우기 색상, 펜 너비, 펜 색상 및 회전 각도가 있습니다.
RenderArea 클래스 구현
생성자는 QWidget 부모(선택 사항)와 함께 QPainterPath 를 인수로 받습니다:
RenderArea::RenderArea(const QPainterPath &path, QWidget *parent) : QWidget(parent), path(path) { penWidth = 1; rotationAngle = 0; setBackgroundRole(QPalette::Base); }
생성자에서는 QPainterPath 매개변수를 사용하여 RenderArea
위젯을 초기화하고 펜 너비와 회전 각도를 초기화합니다. 또한 background role, QPalette::Base 위젯을 설정합니다. 은 일반적으로 흰색입니다.
QSize RenderArea::minimumSizeHint() const { return QSize(50, 50); } QSize RenderArea::sizeHint() const { return QSize(100, 100); }
그런 다음 QWidget::minimumSizeHint() 및 QWidget::sizeHint() 함수를 다시 구현하여 애플리케이션 내에서 RenderArea
위젯의 크기를 적절하게 조정합니다.
void RenderArea::setFillRule(Qt::FillRule rule) { path.setFillRule(rule); update(); } void RenderArea::setFillGradient(const QColor &color1, const QColor &color2) { fillColor1 = color1; fillColor2 = color2; update(); } void RenderArea::setPenWidth(int width) { penWidth = width; update(); } void RenderArea::setPenColor(const QColor &color) { penColor = color; update(); } void RenderArea::setRotationAngle(int degrees) { rotationAngle = degrees; update(); }
다양한 공용 슬롯은 관련 속성을 설정하여 RenderArea
위젯의 페인터 경로를 업데이트하고 QWidget::update() 함수를 호출하여 새 렌더링 환경설정으로 위젯을 강제로 다시 칠합니다.
QWidget::update() 슬롯은 즉각적으로 다시 그리는 것이 아니라 Qt가 메인 이벤트 루프로 돌아갈 때 처리할 페인트 이벤트를 예약합니다.
void RenderArea::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing);
페인트 이벤트는 위젯의 전체 또는 일부를 다시 칠하라는 요청입니다. paintEvent() 함수는 위젯의 페인트 이벤트를 수신하기 위해 다시 구현할 수 있는 이벤트 핸들러입니다. 이벤트 핸들러를 다시 구현하여 RenderArea
위젯의 페인터 경로를 렌더링합니다.
먼저 RenderArea
인스턴스에 대해 QPainter 를 생성하고 페인터의 렌더링 힌트를 설정합니다. QPainter::RenderHints 는 특정 엔진에서 존중할 수도 있고 그렇지 않을 수도 있는 QPainter 에 플래그를 지정하는 데 사용됩니다. QPainter::Antialiasing 는 엔진이 가능한 경우 프리미티브의 가장자리를 안티 앨리어싱(원본 픽셀 주위에 추가 픽셀을 넣어 가장자리를 부드럽게 하는 것)해야 함을 나타냅니다.
painter.scale(width() / 100.0, height() / 100.0); painter.translate(50.0, 50.0); painter.rotate(-rotationAngle); painter.translate(-50.0, -50.0);
그런 다음 QPainter 의 좌표계 크기를 조정하여 페인터 경로가 적절한 크기로 렌더링되도록, 즉 애플리케이션의 크기가 조정될 때 RenderArea
위젯과 함께 커지도록 합니다. 다양한 페인터 경로를 구성할 때 모두 너비가 100픽셀인 정사각형( RenderArea::sizeHint()
)에 해당하는 정사각형 내에서 렌더링되었습니다. QPainter::scale() 함수는 RenderArea
위젯의 현재 너비와 높이를 100으로 나누어 좌표계의 스케일을 조정합니다.
이제 페인터 경로의 크기가 적절하다고 확인되면 좌표계를 변환하여 페인터 경로가 RenderArea
위젯의 중심을 중심으로 회전하도록 만들 수 있습니다. 회전을 수행한 후에는 좌표계를 다시 변환하는 것을 잊지 말아야 합니다.
painter.setPen(QPen(penColor, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); QLinearGradient gradient(0, 0, 0, 100); gradient.setColorAt(0.0, fillColor1); gradient.setColorAt(1.0, fillColor2); painter.setBrush(gradient); painter.drawPath(path); }
그런 다음 QPainter 의 펜을 인스턴스의 렌더링 기본 설정으로 설정합니다. QLinearGradient 를 생성하고 RenderArea
위젯의 채우기 색상에 해당하는 색상을 설정합니다. 마지막으로 QPainter 의 브러시를 설정하고(그라데이션은 자동으로 QBrush 로 변환됨) QPainter::drawPath() 함수를 사용하여 RenderArea
위젯의 페인터 경로를 그립니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.