Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213

Залить контур градиентом, меняющимся вдоль толщины контура

21.09.2025, 00:42. Показов 759. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем не получается залить контур нужным способом. См. картинку. Пробовал все значения QGradient::CoordinateMode, и даже с QBrush химичить пробовал.

Создаю QPen примерно так:

C++ (Qt)
1
2
3
4
5
    QLinearGradient gr(0,0.5,1,0.5);
    gr.setCoordinateMode(QGradient::ObjectMode);
    gr.setColorAt(0.0,QColor(0,255,0));
    gr.setColorAt(1.0,QColor(0,0,0));
    QPen pn(gr,4);
Круг - просто пример (для него можно как-то выкрутиться через радиальный градиент), а надо чтобы для любой фигуры получалась такая обводка.
Изображения
 
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.09.2025, 00:42
Ответы с готовыми решениями:

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

Отрисовка кривой траектории по меняющимся координатам
Прошу помощи с проблемой в отрисовщике Paint Event . drawPolyline не работает (требуется отрисовка...

Изменение толщины линий между ячейками QTabelView
Вот по умолчанию между ячейками линии очень тонкие. И никак не могу найти как же поменять толщину (...

5
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,378
21.09.2025, 01:24
Geek Geekson, QRadialGradient еще есть
зы аа, для любой фигуры... глянь эффекты, щас вспомню название класса...

Добавлено через 4 минуты
вот

Добавлено через 1 минуту
из них навскидку QGraphicsDropShadowEffect без смещения можно попробовать

Добавлено через 19 минут
а не, попробовал, это не подходит походу- похоже надо делать кастомный эффект.
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
21.09.2025, 12:34  [ТС]
Цитата Сообщение от sdf45 Посмотреть сообщение
похоже надо делать кастомный эффект
А что под этим понимается? Просто собственный код командами рисования?
0
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,378
21.09.2025, 13:08
Geek Geekson, это где рисуется такой круг? На QGraphicsView?
По простому у меня пока не получается, мб кто знающий подскажет.
Если получится решить-выложу листинг.
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
21.09.2025, 14:03  [ТС]
sdf45, не, просто рисование через QPainter. Я делал тесты - если на экране основная масса объектов постоянно движется и они мало перекрываются - QGraphicsView вообще не оправдан, простое рисование тогда работает гораздо шустрее.
0
1131 / 727 / 194
Регистрация: 30.03.2021
Сообщений: 2,378
22.09.2025, 04:32
В обшем с кастомным граф.эффектом я не смог(да его и ставить надо на какой-то обьект,- при рисовании в пейнтере не получится). Сделал хреновенький вариант с обводками QPainterPathStroker, но он точно не про скорость и оптимальность и (возможно) не для всех фигур (с кривыми не пробовал, нейросетку попросил нарисовать какую-то звездочку)
Кликните здесь для просмотра всего текста


Тут градиент захардкожен, а так то нужна еще куча настроек как в QGradient.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPainterPath>
#include <QPainterPathStroker>
 
class Widget : public QWidget
{
private:
    QPainterPath pathFigure;
    QList<QPainterPath> halo;
    int haloWidth{20};
    QPoint center{};
 
public:
    Widget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()):QWidget(parent, f){
 
        QPalette pal=palette();
        pal.setColor(QPalette::Window, Qt::black);
        setPalette(pal);
 
        pathFigure=createStarPath(center, 100, 30);
 
        QPainterPathStroker stroker;
        stroker.setJoinStyle(Qt::RoundJoin);
 
        for(int i=haloWidth*2; i>=0; i--){
            stroker.setWidth(i);
            halo<<stroker.createStroke(pathFigure).simplified();
        }
    }
 
private:    
    QPainterPath createStarPath(const QPoint &center,
                                const qreal &outerRadius,
                                const qreal &innerRadius)const{
        QPainterPath path;
        path.moveTo(center.x(), center.y() - outerRadius);
        path.lineTo(center.x() + innerRadius, center.y() - innerRadius / 2.0);
        path.lineTo(center.x() + outerRadius, center.y());
        path.lineTo(center.x() + innerRadius, center.y() + innerRadius / 2.0);
        path.lineTo(center.x(), center.y() + outerRadius);
        path.lineTo(center.x() - innerRadius, center.y() + innerRadius / 2.0);
        path.lineTo(center.x() - outerRadius, center.y());
        path.lineTo(center.x() - innerRadius, center.y() - innerRadius / 2.0);
        path.lineTo(center.x(), center.y() - outerRadius);
        path.closeSubpath();
        return path;
    }
 
    void drawGrid(){
        QPainter painter(this);
        painter.setPen(QPen(Qt::darkGray));
        int delta=50;
        for(int x=0; x<=rect().width(); x+=delta)
            painter.drawLine(x, 0, x, rect().bottom());
        for(int y=0; y<=rect().height(); y+=delta)
            painter.drawLine(0, y,rect().right(), y);
    }
 
    void drawBody(QPointF center){
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.translate(center);
        painter.setPen(QPen(Qt::NoPen));
        painter.setBrush(QBrush(Qt::darkGray));
        painter.drawPath(pathFigure);
    }
 
    void drawHalo(QPointF center){
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.translate(center);
        painter.setBrush(Qt::transparent);
        QColor color=Qt::green;
        color.setAlpha(0);
        color.setGreen(0);
        int a=254 / halo.size();
        //тут сам делаешь нужный градиент
        for(const auto &path : halo){
            color.setGreen(color.green()+a);
            color.setAlpha(color.alpha()+a);
            painter.setPen(QPen(color));
            painter.drawPath(path);
        }
    }
 
protected:
    void paintEvent(QPaintEvent *event){
        QWidget::paintEvent(event);
        center=rect().center();
        drawGrid();
        drawHalo(center);
        drawBody(center);
    }
};
 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.09.2025, 04:32
Помогаю со студенческими работами здесь

Изменение шрифта, стиля шрифта, толщины и т.д., надписи у кнопки
Всем доброго времени суток! Появился вопрос. Есть ли способ изменить размер шрифта, его стиль,...

Как через CSS изменить толщину границ ячеек в таблице QTableView?
Здравствуйте. Использую программу от сименса (WinCC OA), которая построена на Qt. Напрямую, с...

Как сделать Header, чтобы при растягивании окна он не менял свою толщину?
Как сделать Header в Qt и чтобы при растягивании окна он не менял свою толщину! А под ним нужно...

Залить окружность цветами
Добрый вечер! Такая проблема: мне нужно рассчитать температуру в узлах тонкостенной трубы(то есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru