Russian Qt Forum
Октябрь 02, 2024, 07:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [QT-4.2.0] Как убрать полоску у QSlider  (Прочитано 4718 раз)
izoomer
Гость
« : Апрель 08, 2007, 00:01 »

Подсчкажите , как убрать полоску у QSlider и нарисовать свой слайдер ... пробывал через стили, но там есть только drawComplexControl , и соответсвенно есть только CC_Slider .... ну рисую я в нем,рисуется вся ... но не двигается слайдер .... Может можно как то по другому ?
Записан
goer
Гость
« Ответ #1 : Апрель 08, 2007, 21:12 »

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

Цитировать

Может можно как то по другому ?


Если вид слайдера является частью Look&Feel приложения, то исключительно лучше использовать стайл.
Записан
izoomer
Гость
« Ответ #2 : Апрель 09, 2007, 11:33 »

Код:

void JStyle::drawComplexControl ( ComplexControl control, const QStyleOptionComplex * option, QPainter * painter, const QWidget * widget ) const
{
if (control == CC_Slider){
              painter->setBrush(QBrush(Qt::blue, Qt::SolidPattern));
painter->drawEllipse(QRect(option->rect.x(),option->rect.y(),option->rect.width() ,option->rect.width()));

} else {
              QWindowsStyle::drawComplexControl(control, option, painter, widget);
}

вот тк сделал в своем классе стилей от QWindowsStile ....
Записан
goer
Гость
« Ответ #3 : Апрель 09, 2007, 12:17 »

Assistant:
Цитировать

QRect QStyleOption::rect
This variable holds the area that should be used for various calculations and painting.


Подозреваю что результатом работы такого кода будет рисование эллипса заполненого синим цветом?

Вобщем, вот как делали свой слайдер люди:
Код:

 switch (control) {
    case CC_Slider:
        if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
            QRect groove = subControlRect(CC_Slider, option, SC_SliderGroove, widget);
            QRect handle = subControlRect(CC_Slider, option, SC_SliderHandle, widget);

            painter->save();

            ........
            ........

            if ((option->subControls & SC_SliderGroove) && groove.isValid()) {
                QPixmap grv = cached(":res/images/slider_bar.png");
                painter->drawPixmap(QRect(groove.x() + 5, groove.y(),
                                          groove.width() - 10, grv.height()),
                                    grv);
            }
            if ((option->subControls & SC_SliderHandle) && handle.isValid()) {
                QPixmap hndl = cached(":res/images/slider_thumb_on.png");
                painter->drawPixmap(handle.topLeft(), hndl);
            }

            painter->restore();
        }
        break;
}


Это кусок кода из определения стиля для демок в QT4.2.2. Код находится по адресу $(qtdir)/demos/shared/arthurstyle.cpp

Как видишь, вначале они пытаются получить QStyleOptionSlider из более общего QStyleOptionComplex. Затем из того же QStyleOptionComplex получают прямоугольник в котором находится желобок(groove) и ползунок(handle). Далее они рисуют соответствующие пиксмапы в этих прямоугольниках. Ничего военного!

Я бы советовал тебе просто передрать тот код и вставить в свой, убрав при этом вызов drawHoverRect() (здесь я заменил эту часть кода точками, поскольку для начала сойдет и рисование без "спецэффектов"), а также рисуя вместо пиксмапов просто прямоугольники. Например так:
Код:

if ((option->subControls & SC_SliderGroove) && groove.isValid()) {
     painter->fillRect(QRect(groove.x() + 5, groove.y(),
                                          groove.width() - 10, grv.height()),
                                    Qt::red);
            }


А вот когда такой простой и не очень красивый слайдер таки нарисуется, тогда начать эксперименты:
- путем исключения "лишних" кусков кода, понять как работает и что делает каждая его строчка;
- нарисовать пискмапы вместо заполненных цветом прямоугольников;
- определить что должно изменяться(рисовться) когда указатель мыши находится над слайдером.
Записан
izoomer
Гость
« Ответ #4 : Апрель 09, 2007, 16:38 »

Цитата: "goer"
Assistant:
Цитировать

QRect QStyleOption::rect
This variable holds the area that should be used for various calculations and painting.


Подозреваю что результатом работы такого кода будет рисование эллипса заполненого синим цветом?

Вобщем, вот как делали свой слайдер люди:
Код:

 switch (control) {
    case CC_Slider:
        if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
            QRect groove = subControlRect(CC_Slider, option, SC_SliderGroove, widget);
            QRect handle = subControlRect(CC_Slider, option, SC_SliderHandle, widget);

            painter->save();

            ........
            ........

            if ((option->subControls & SC_SliderGroove) && groove.isValid()) {
                QPixmap grv = cached(":res/images/slider_bar.png");
                painter->drawPixmap(QRect(groove.x() + 5, groove.y(),
                                          groove.width() - 10, grv.height()),
                                    grv);
            }
            if ((option->subControls & SC_SliderHandle) && handle.isValid()) {
                QPixmap hndl = cached(":res/images/slider_thumb_on.png");
                painter->drawPixmap(handle.topLeft(), hndl);
            }

            painter->restore();
        }
        break;
}


Это кусок кода из определения стиля для демок в QT4.2.2. Код находится по адресу $(qtdir)/demos/shared/arthurstyle.cpp

Как видишь, вначале они пытаются получить QStyleOptionSlider из более общего QStyleOptionComplex. Затем из того же QStyleOptionComplex получают прямоугольник в котором находится желобок(groove) и ползунок(handle). Далее они рисуют соответствующие пиксмапы в этих прямоугольниках. Ничего военного!

Я бы советовал тебе просто передрать тот код и вставить в свой, убрав при этом вызов drawHoverRect() (здесь я заменил эту часть кода точками, поскольку для начала сойдет и рисование без "спецэффектов"), а также рисуя вместо пиксмапов просто прямоугольники. Например так:
Код:

if ((option->subControls & SC_SliderGroove) && groove.isValid()) {
     painter->fillRect(QRect(groove.x() + 5, groove.y(),
                                          groove.width() - 10, grv.height()),
                                    Qt::red);
            }


А вот когда такой простой и не очень красивый слайдер таки нарисуется, тогда начать эксперименты:
- путем исключения "лишних" кусков кода, понять как работает и что делает каждая его строчка;
- нарисовать пискмапы вместо заполненных цветом прямоугольников;
- определить что должно изменяться(рисовться) когда указатель мыши находится над слайдером.


РАБОТАЕТ !!!!! Преогромнейшее спасибо, от чистого сердца. А то не знал уже куда копать ...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.064 секунд. Запросов: 21.