Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
1

QDial подписать деления

24.05.2017, 10:12. Показов 4282. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как подписать деления на QDial
Название: Снимок.JPG
Просмотров: 100

Размер: 22.2 Кб
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.05.2017, 10:12
Ответы с готовыми решениями:

Подписать слот на сигнал от N объектов одного класса
Здравствуйте, есть N-количество объектов класса Circle в массиве field (MainWindow), у класса...

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

Найти частное и остаток от деления нацело без операции деления
1)Дано целое число A (> 0) и целое число B (> 0). Найти долю Q и остаток R от деления нацело числа...

Найти частное от деления нацело N на K, а также остаток от этого деления
While3. Даны целые положительные числа N и K. Используя только операции сложения и вычитания, найти...

18
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
24.05.2017, 16:23 2
Krounis, Можно либо размещать подписи с помощью QLabel, либо нужно наследовать QDial и добавлять подписи в его рисование.
1
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
24.05.2017, 18:42  [ТС] 3
Wyn, а можно сзади виджета разместить фон с цифрами?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
24.05.2017, 18:50 4
Krounis, а что запрещает? Фон у этого виджета прозрачный, так что... Порядок виджетов (спереди/сзади) можешь редактировать в Qt Designer'e, в контекстном меню виджета.
1
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
24.05.2017, 19:08  [ТС] 5
TRam_, а как фон загрузить? через Qt resource file?
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
24.05.2017, 19:46 6
Krounis, Да, фон нужно загружать в ресурсный файл. А затем - выставлять виджету. Сделать это можно как в с++, так и в дизайнере, используя qss(border-image или background-image).
1
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
24.05.2017, 19:57  [ТС] 7
Wyn, а как добавить ресурсный файл (img.jpg) в проект?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
24.05.2017, 20:00 8
Krounis, открываешь .qrc - файл и добавляешь. Если под MSVS не открывается, открывай непосредственно Designer'ом. А вообще почитай про документацию по ним.
0
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
24.05.2017, 20:07  [ТС] 9
TRam_, почему то кнопка "добавить файлы" не активна:
QDial подписать деления
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
24.05.2017, 20:09 10
Вначале префикс добавить, только потом файлы. Всё же почитай мануалы, а то ж после добавления этот ресурс надо будет ещё указать...
0
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
24.05.2017, 20:27  [ТС] 11
TRam_, хорошо, спасибо

Добавлено через 15 минут
TRam_, а как указать на ресурс если я хочу использовать его в qt designer'e, добавил префикс, картинку, а вот в дизайнере при выборе background-image ничего не появляется? а все) надо было просто сохранить .qrc
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.05.2017, 21:15 12
Цитата Сообщение от Wyn Посмотреть сообщение
Можно либо размещать подписи с помощью QLabel,
Цитата Сообщение от Krounis Посмотреть сообщение
Wyn, а можно сзади виджета разместить фон с цифрами?
Все это быдлокодные варианты, при масштабировании все поплывет.

Про этот компонент можно забыть лучше либо взять поставить http://qwt.sourceforge.net/class_qwt_dial.html
Или же рисовать компонент ручками, и возможно оформить в виде отдельного компонента.
(например наследником от QAbstractSlider)
0
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
24.05.2017, 21:15  [ТС] 13
Avazart, а какие еще есть варианты? Как унаследовать QDial и дорисовать ему значения?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.05.2017, 21:37 14
Цитата Сообщение от Krounis Посмотреть сообщение
Как унаследовать QDial и дорисовать ему значения?
Думаю это не вариант, можно разве что залезть во внутрь его исходников и содрать прорисовку.
А наследоваться от него скорее всего плохая затея ибо тут нужен будет угол, радиус и другие размеры которые скорее всего будут недоступны при наследовании.

Так что лучше наследоваться от его предка.

Не по теме:

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



Вот к примеру прорисовка взятая из исходников:
C++ (Qt)
1
2
3
4
5
6
void QDial::paintEvent(QPaintEvent *)
{
    Q_D(QDial);
    QStylePainter p(this);
    p.drawComplexControl(QStyle::CC_Dial, d->getStyleOption());
}
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
QStyleOptionSlider QDialPrivate::getStyleOption() const
{
    Q_Q(const QDial);
    QStyleOptionSlider opt;
    opt.init(q);
    opt.minimum = minimum;
    opt.maximum = maximum;
    opt.sliderPosition = position;
    opt.sliderValue = value;
    opt.singleStep = singleStep;
    opt.pageStep = pageStep;
    opt.upsideDown = !invertedAppearance;
    opt.notchTarget = target;
    opt.dialWrapping = wrapping;
    opt.subControls = QStyle::SC_All;
    opt.activeSubControls = QStyle::SC_None;
    if (!showNotches) {
        opt.subControls &= ~QStyle::SC_DialTickmarks;
        opt.tickPosition = QSlider::TicksAbove;
    } else {
        opt.tickPosition = QSlider::NoTicks;
    }
    opt.tickInterval = q->notchSize();
    return opt;
}
И тут тоже блин непонятно как получить к примеру радиус ибо прорисовка видимо еще глубже.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
24.05.2017, 22:08 15
Цитата Сообщение от Avazart Посмотреть сообщение
ибо прорисовка видимо еще глубже
Под виндой перерисовка лежит в QStyleHelper'е, выглядит так:
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
106
107
108
void drawDial(const QStyleOptionSlider *option, QPainter *painter)
{
    QPalette pal = option->palette;
    QColor buttonColor = pal.button().color();
    const int width = option->rect.width();
    const int height = option->rect.height();
    const bool enabled = option->state & QStyle::State_Enabled;
    qreal r = qMin(width, height) / 2;
    r -= r/50;
    const qreal penSize = r/20.0;
 
    painter->save();
    painter->setRenderHint(QPainter::Antialiasing);
 
    // Draw notches
    if (option->subControls & QStyle::SC_DialTickmarks) {
        painter->setPen(option->palette.dark().color().darker(120));
        painter->drawLines(QStyleHelper::calcLines(option));
    }
 
    // Cache dial background
    BEGIN_STYLE_PIXMAPCACHE(QString::fromLatin1("qdial"));
    p->setRenderHint(QPainter::Antialiasing);
 
    const qreal d_ = r / 6;
    const qreal dx = option->rect.x() + d_ + (width - 2 * r) / 2 + 1;
    const qreal dy = option->rect.y() + d_ + (height - 2 * r) / 2 + 1;
 
    QRectF br = QRectF(dx + 0.5, dy + 0.5,
                       int(r * 2 - 2 * d_ - 2),
                       int(r * 2 - 2 * d_ - 2));
    buttonColor.setHsv(buttonColor .hue(),
                       qMin(140, buttonColor .saturation()),
                       qMax(180, buttonColor.value()));
    QColor shadowColor(0, 0, 0, 20);
 
    if (enabled) {
        // Drop shadow
        qreal shadowSize = qMax(1.0, penSize/2.0);
        QRectF shadowRect= br.adjusted(-2*shadowSize, -2*shadowSize,
                                       2*shadowSize, 2*shadowSize);
        QRadialGradient shadowGradient(shadowRect.center().x(),
                                       shadowRect.center().y(), shadowRect.width()/2.0,
                                       shadowRect.center().x(), shadowRect.center().y());
        shadowGradient.setColorAt(qreal(0.91), QColor(0, 0, 0, 40));
        shadowGradient.setColorAt(qreal(1.0), Qt::transparent);
        p->setBrush(shadowGradient);
        p->setPen(Qt::NoPen);
        p->translate(shadowSize, shadowSize);
        p->drawEllipse(shadowRect);
        p->translate(-shadowSize, -shadowSize);
 
        // Main gradient
        QRadialGradient gradient(br.center().x() - br.width()/3, dy,
                                 br.width()*1.3, br.center().x(),
                                 br.center().y() - br.height()/2);
        gradient.setColorAt(0, buttonColor.lighter(110));
        gradient.setColorAt(qreal(0.5), buttonColor);
        gradient.setColorAt(qreal(0.501), buttonColor.darker(102));
        gradient.setColorAt(1, buttonColor.darker(115));
        p->setBrush(gradient);
    } else {
        p->setBrush(Qt::NoBrush);
    }
 
    p->setPen(QPen(buttonColor.darker(280)));
    p->drawEllipse(br);
    p->setBrush(Qt::NoBrush);
    p->setPen(buttonColor.lighter(110));
    p->drawEllipse(br.adjusted(1, 1, -1, -1));
 
    if (option->state & QStyle::State_HasFocus) {
        QColor highlight = pal.highlight().color();
        highlight.setHsv(highlight.hue(),
                         qMin(160, highlight.saturation()),
                         qMax(230, highlight.value()));
        highlight.setAlpha(127);
        p->setPen(QPen(highlight, 2.0));
        p->setBrush(Qt::NoBrush);
        p->drawEllipse(br.adjusted(-1, -1, 1, 1));
    }
 
    END_STYLE_PIXMAPCACHE
 
    QPointF dp = calcRadialPos(option, qreal(0.70));
    buttonColor = buttonColor.lighter(104);
    buttonColor.setAlphaF(qreal(0.8));
    const qreal ds = r/qreal(7.0);
    QRectF dialRect(dp.x() - ds, dp.y() - ds, 2*ds, 2*ds);
    QRadialGradient dialGradient(dialRect.center().x() + dialRect.width()/2,
                                 dialRect.center().y() + dialRect.width(),
                                 dialRect.width()*2,
                                 dialRect.center().x(), dialRect.center().y());
    dialGradient.setColorAt(1, buttonColor.darker(140));
    dialGradient.setColorAt(qreal(0.4), buttonColor.darker(120));
    dialGradient.setColorAt(0, buttonColor.darker(110));
    if (penSize > 3.0) {
        painter->setPen(QPen(QColor(0, 0, 0, 25), penSize));
        painter->drawLine(calcRadialPos(option, qreal(0.90)), calcRadialPos(option, qreal(0.96)));
    }
 
    painter->setBrush(dialGradient);
    painter->setPen(QColor(255, 255, 255, 150));
    painter->drawEllipse(dialRect.adjusted(-1, -1, 1, 1));
    painter->setPen(QColor(0, 0, 0, 80));
    painter->drawEllipse(dialRect);
    painter->restore();
}
1
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
24.05.2017, 22:11  [ТС] 16
Avazart, сложновато) наверное я все-таки буду использовать QwtDial, тем более Qwt подключал ранее для построения графиков
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.05.2017, 22:14 17
TRam_, Хм.. тогда в принципе наследование от QDial может быть уместным. Можно попробовать переопределить метод

C++ (Qt)
1
void    initStyleOption(QStyleOptionSlider *option) const
http://doc.qt.io/qt-5/qdial.html#initStyleOption

Но все равно не красиво как то...
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
24.05.2017, 22:19 18
Avazart, опциями подписи к линиям не дорисуешь. Тем более что из-за подписей нужно будет уменьшать радиус этой крутилки. Так что легче использовать готовый из Qwt (если там это уже сделано), чем снова изобретать велосипед.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.05.2017, 22:20 19
Цитата Сообщение от TRam_ Посмотреть сообщение
Avazart, опциями подписи к линиям не дорисуешь. Тем более что из-за подписей нужно будет уменьшать радиус этой крутилки.
Уменьшать радиус по любому нужно. Но это криво ибо у нас не радиус а width/height и мы полагаемся на код подсмотренный из этой ф-ции.

Т.е. лучше сразу рисовать вручную, т.е перетащить код этой ф-ции в PaintEvent.

Цитата Сообщение от TRam_ Посмотреть сообщение
Так что легче использовать готовый из Qwt (если там это уже сделано), чем снова изобретать велосипед.
Естественно.
0
24.05.2017, 22:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2017, 22:20
Помогаю со студенческими работами здесь

Найти частное от деления нацело N на K, а также остаток от этого деления
Даны целые положительные числа N и K. Используя только операции сложения и вычитания, найти частное...

Операцией деления нацело и взятия остатка от деления определить есть ли в числе цифра 0
Дано целое число N (> 0).С помощью операцией деления нацело и взятия остатка от деления определить,...

Используя операции деления нацело и взятия остатка от деления, вывести все цифры числа
Дано целое число N (> 0). Используя операции деления нацело и взятия остатка от деления, вывести...

Используя операции деления нацело и взятия остатка от деления, вывести все цифры числа
Дано целое число N (> 0). Используя операции деления нацело и взятия остатка от деления, вывести...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru