Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: izoomer от Апрель 08, 2007, 00:01



Название: [QT-4.2.0] Как убрать полоску у QSlider
Отправлено: izoomer от Апрель 08, 2007, 00:01
Подсчкажите , как убрать полоску у QSlider и нарисовать свой слайдер ... пробывал через стили, но там есть только drawComplexControl , и соответсвенно есть только CC_Slider .... ну рисую я в нем,рисуется вся ... но не двигается слайдер .... Может можно как то по другому ?


Название: [QT-4.2.0] Как убрать полоску у QSlider
Отправлено: goer от Апрель 08, 2007, 21:12
Не может быть! Наверняка слайдер двигается, проверь по сигналам. Скорее всего ты рисуешь SC_SliderHandle в одной и тойже позиции, поэтому визуально кажется что ползунок стоит на месте.
Посмотреть бы код...

Цитировать

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


Если вид слайдера является частью Look&Feel приложения, то исключительно лучше использовать стайл.


Название: [QT-4.2.0] Как убрать полоску у QSlider
Отправлено: izoomer от Апрель 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 ....


Название: [QT-4.2.0] Как убрать полоску у QSlider
Отправлено: goer от Апрель 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);
            }


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


Название: [QT-4.2.0] Как убрать полоску у QSlider
Отправлено: izoomer от Апрель 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);
            }


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


РАБОТАЕТ !!!!! Преогромнейшее спасибо, от чистого сердца. А то не знал уже куда копать ...