Вы, вероятно, должны использовать 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.). Каждый зуб в этом компоненте является формой.
В Qt 5.12 создание пользовательских виджетов / графики с paintEvent (), вероятно, не лучший вариант, но если вы хотите придерживаться этого, есть хороший класс QSvgRenderer, который может визуализировать SVG почти так же, как вы использовали для рисования линий.