Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
1

Рисование на сабконтролере

18.04.2014, 20:57. Показов 2093. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброй ночи форумчане! Есть ли возможность рисовать на сабконтроллере виджета - например я хочу нарисовать посреди groove горизонтального слайдера вертикальную красную линию. Я так понял надо копать в сторону QStyleOptionSlider + QStylePainter но поизучав доку чего либо внятного по своему вопросу не нашел
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2014, 20:57
Ответы с готовыми решениями:

Рисование Рисование точек по координатам
Доброе время суток. Помогите мне наглядным примером. У меня есть массив координат a х у 1 2 3...

Рисование
Помогите пожалуйста

Рисование
Вот задача: Нарисовать квадрат, который в каждый момент своего движения качается одной из сторон к...

Рисование
Добрый день!В программирование еще новичек,прошу совета.Создаю приложение,нужно следующее:...

4
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
18.04.2014, 21:56 2
Вот один из вариантов: http://qt-project.org/doc/qt-4... tyles.html

А вот пример как нарисовать скролбар самому с нуля:
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
void ScrollBar::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
 
    QStyleOptionSlider opt;
    opt.initFrom(this);
 
    opt.state &= ~QStyle::State_HasFocus;
 
    opt.rect = rect();
    if (isEnabled())
        opt.state |= QStyle::State_Enabled;
    opt.orientation = (orientation() == Qt::Vertical) ? Qt::Vertical : Qt::Horizontal;
 
    if (orientation() == Qt::Horizontal)
        opt.state |= QStyle::State_Horizontal;
    else
        opt.state &= ~QStyle::State_Horizontal;
 
    opt.sliderValue = value();
    opt.sliderPosition = opt.sliderValue;
    opt.pageStep = pageStep();
    opt.minimum = 0;
    opt.maximum = qMax(0, maximum());
    QApplication::style()->drawComplexControl(QStyle::CC_ScrollBar, &opt, &painter, this);
}
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
20.04.2014, 21:34  [ТС] 3
RazrFalcon, по этому пути собственно и иду... У меня вот какая проблема - мне нужно на горизонтальном стилизованном слайдер нарисовать вертикальную линию на отметке нуля, если делать так
C++ (Qt)
1
2
3
4
5
6
void Claszz::paintEvent(QPaintEvent* e)
{
   QPainter p;
 /*рисование линии*/
 QSlider::paintEvent(e);
}
то есть такая фигня, что если сабконтроллы слайдера стилизованны - бэкграунд и прочее прочее, то отрисованной линии не видно - родительский paintEvent рисуется поверх моей линии, если же делать

C++ (Qt)
1
2
3
4
5
6
void Claszz::paintEvent(QPaintEvent* e)
{
 QSlider::paintEvent(e);
   QPainter p;
 /*рисование линии*/
}
то линия рисуется поверх хэндла...

я пошел по пути следующему
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
 void paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
        QStylePainter painter(this);
 
        // groove & ticks
        QStyleOptionSlider opt;
        initStyleOption(&opt);
        opt.sliderValue = 0;
        opt.sliderPosition = 0;
        opt.subControls = QStyle::SC_SliderGroove | QStyle::SC_SliderTickmarks;
        painter.drawComplexControl(QStyle::CC_Slider, opt);
 
        QPoint center = rect().center();
        QPoint top = QPoint(center.x(), center.y() + 20);
        QPoint bottom = QPoint(center.x(), center.y() - 20);
        painter.setPen(Qt::red);
        painter.drawLine(top, bottom);
 
        opt.subControls = QStyle::SC_SliderHandle;
        opt.activeSubControls = QStyle::SC_SliderHandle;
        painter.drawComplexControl(QStyle::CC_Slider, opt);
 
    }
и думалось мне что все удасться, однако при прорисовки хэндла перерисовывается все остальные сабконтроллы - я в смятении
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
20.04.2014, 21:41 4
Эм... я не понял в чем проблема. У меня ваш код рисует красную линию. Что вас не устраивает?
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
21.04.2014, 13:27  [ТС] 5
ок, полный код

CustomSlider.h
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
#include <QSlider>
#include <QStylePainter>
 
class CustomSlider : public QSlider
{
    Q_OBJECT
public:
    CustomSlider(QWidget *parent = 0): QSlider(Qt::Horizontal, parent)
    {
        setStyleSheet("QSlider{background-color: blue;}"
             "QSlider::groove:horizontal { background: red;   position: absolute; left: 4px; right: 4px; height: 10px;}"
             "QSlider::handle:horizontal {height: 10px; background: green;margin: 0 -4px; border-radius: 4px;}"
             "QSlider::add-page:horizontal {background: white;}"
             "QSlider::sub-page:horizontal {background: pink;}"
                 );
    }
 
    void paintEvent(QPaintEvent *event)
    {
        QSlider::paintEvent(event);
 
        QStylePainter painter(this);
        QPoint center = rect().center();
        QPoint top = QPoint(center.x(), center.y() + 20);
        QPoint bottom = QPoint(center.x(), center.y() - 20);
        painter.setPen(Qt::red);
        painter.drawLine(top, bottom);
    }
};
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#include "CustomSlider.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    CustomSlider sl;
 
    sl.show();
    
    return a.exec();
}
и попробуйте в paintEvent родительский paintEvent ставить либо в конец либо в начало тела функции

Добавлено через 8 минут
а потом поменяйте тело функции на то что с отрисовкой через QStylePainter + QStyleOptionSlider

Добавлено через 15 часов 32 минуты
собственно проблема решается - если бэкграунд не стилизуется, отсюда выход - бэкграунд виджета на котором рисуется кастомный слайдер стилизуем, бэкграунд слайдера - делаем прозрачным - отрисовка корректная
0
21.04.2014, 13:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2014, 13:27
Помогаю со студенческими работами здесь

Рисование
Можно ли рисовать на рамке чужого окна ?

Рисование на с++
нужно сделать лаболаторку и там рисунок сделать подскажите как будут разные фигуры ( или это есть...

Рисование в С++
У кого есть какие примеры рисования в С++. Вот например мой, два эллипса с заливкой и фоном,...

Рисование
Реализовать рисование так, чтобы по нажатию мыши (щелкая левой кнопкой и удерживая её при...

С++ Рисование
Добрий день!) Пожалуйста помогите мне нарисовать тикву в C++ вибивает ошибку С2679 Вот...

рисование
иконки ясное дело делаются в фотошопе так же как и оформление ,но вот вопрос как рисуются другие...


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

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