Готовые фигуры в Qt - PullRequest
       44

Готовые фигуры в Qt

0 голосов
/ 28 апреля 2020

Как видно из заголовка, я пытаюсь использовать предопределенные фигуры, но я не нахожу ни одного модуля или класса, предназначенного для этого, я думаю, что Qt не предлагает такой возможности (я могу ошибаться), и все должно быть сделано вручную путем переопределения функции paintEvent, поэтому я решил создать свою собственную форму (линию), проблема в том, что она не отображается правильно, когда я применяю метод setRenderHint:


// x1  y1  x2  y2 : are integers that change according to the geometry of the parent (QWidget)

void Line::paintEvent(QPaintEvent*)
{
   QPainter shape(this);

   shape.setRenderHint(QPainter::Antialiasing); // <== Here

   QPen pen(Qt::black);
   forme.setPen(pen);

   shape.drawLine(x1,y1,x2,y2);
}

Если я уберу эту функцию, фигура будет выглядеть некрасиво (по диагонали), и если я сохраню ее, на нарисованной линии появится градиент:

Image :

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


Поэтому мой вопрос: Можно ли создавать фигуры, которые не зависят от функции paintEvent? Иначе, есть ли какая-нибудь внешняя библиотека, которая предлагает готовые формы?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Вы, вероятно, должны использовать QML, а не виджеты. Это кажется очень естественным для проблемы, которую вы описали. QML предоставляет компонент Shape , который может легко и удобно отображать различные формы. Создайте его и добавьте ShapePath потомков для рендеринга реальных фигур.

Сам по себе Qt не предоставляет большого числа фигур (только прямоугольники, линии и эллипсы), но поддерживает большое подмножество SVG , что означает, что вы можете создать любую библиотеку форм для вашего сердца в виде файлов SVG и загрузить их. QML может выглядеть так:

Shape
{
    id: root

    ShapePath  {
         id: selection
         fillColor: "#EBF2F7"
         strokeWidth: 5
         strokeColor: "#0100ADEF"

         PathSvg {
             path: "L 150 50 L 100 150 z" // your path goes here 
         }     
     }
}

Вот пример компонента, созданного в Qt 5.12 из графического файла SVG, нарисованного в графическом редакторе c и визуализированного с использованием компонентов Shape. Это векторная графика, полностью изменяющая размеры и полностью интерактивная в реальном приложении (можно выбирать отдельные зубы, отключать некоторые из них и т. Д. c.). Каждый зуб в этом компоненте является формой.

Sample widget created from SVG graphics

В Qt 5.12 создание пользовательских виджетов / графики с paintEvent (), вероятно, не лучший вариант, но если вы хотите придерживаться этого, есть хороший класс QSvgRenderer, который может визуализировать SVG почти так же, как вы использовали для рисования линий.

1 голос
/ 30 апреля 2020

Виджеты тяжелые, и использование их для отдельных форм бесполезно. Вы хотите иметь один виджет, который может перебирать список фигур и рисовать их. Такие виджеты существуют: QGraphicsSceneView показывает, что находится внутри QGraphicsScene. Вы можете начать с sh.

...