Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: cipher от Май 31, 2007, 17:42



Название: QSlider
Отправлено: cipher от Май 31, 2007, 17:42
День добрый, подскажет кто из знающих как наваять вот такой slider

(http://cipher.nm.ru/slider.JPG)

Обычный slider выглядит вот так

(http://cipher.nm.ru/slider2.JPG)

т.е. мне нужно чтобы обязательно была эта белая полоска

В WinAPI такое чудо делается путем добавления ключа TBS_ENABLESELRANGE - вот так вот

Код:

_hSliderWnd = CreateWindowEx(0, TRACKBAR_CLASS, "Slider",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | TBS_BOTTOM | TBS_ENABLESELRANGE | TBS_AUTOTICKS 0, 0, 10, 10, hWnd_, NULL, NULL, 0);


добавлено спустя 5 часов 48 минут:

 неужели никто не пробовал организовать такой slider?


Название: QSlider
Отправлено: Racheengel от Май 31, 2007, 21:29
смотри в сторону paintEvent()


Название: QSlider
Отправлено: pakulo от Июнь 01, 2007, 07:44
Да, прийдется наверное самому прорисовать его.


Название: QSlider
Отправлено: cipher от Июнь 01, 2007, 10:44
люди, вы понимаете какой это гемор самому ваять, да ни за что не поверю что QT не позволяет так делать. Блин не может быть


Название: QSlider
Отправлено: goer от Июнь 01, 2007, 11:00
Еще как может :-)

Если это чисто виндовый скин слайдера, то почему кути должна его поддерживать? А что прикажешь рисовать ей под линуксом? Или маком?

Надо или менять библиотеку, или написать несложную процедуру рисования слайдера. Кстати с использованием стилей рисовать слайдер еще проще (т.к. там можно получить QRect ключевых областей слайдера - желобок, ползунок и т.д.)


Название: QSlider
Отправлено: cipher от Июнь 01, 2007, 11:21
Цитировать
Если это чисто виндовый скин слайдера, то почему кути должна его поддерживать?


А нафига тогда QT? Вот QT и должен был предоставить мне такой control. Блин, так QSlider и выделять области на самой шкале тоже не умеет!!! Как-то совсем убого. Ладно а что ты там про стили говорил? Можно подробнее, чую придётся самому всё-таки ваять

добавлено спустя 2 минуты:

 а ... или может кто знает где можно дополнительные компоненты взять в сети. Должны же быть какие-то коллекции не стандартных control'ов. У меня чё-то поиск пока нифига не выдаёт


Название: QSlider
Отправлено: goer от Июнь 01, 2007, 11:45
Бывают же люди... Такие не только микроскопом гвозди будут забивать, они еще будут возмущаться почему микроскоп забивает гвозди хуже молотка.

Цитировать
А нафига тогда QT?


"Нафига" нужна кути почитай на сайте тролей.


Цитировать
Должны же быть какие-то коллекции не стандартных control'ов. У меня чё-то поиск пока нифига не выдаёт


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


Название: QSlider
Отправлено: cipher от Июнь 01, 2007, 11:49
При чём тут микроскоп, ну если ты контора которая ваяет кроссплатформенную GUI так делай её удобной. Ладно это приперательство ни к чему нас не приведёт.

Мне всё же хотелось бы услышать про какие стили ты говорил?

Цитировать
Кстати с использованием стилей рисовать слайдер еще проще


Название: QSlider
Отправлено: goer от Июнь 01, 2007, 11:58
Цитировать
При чём тут микроскоп, ну если ты контора которая ваяет кроссплатформенную GUI так делай её удобной.


Они и сделали очень мощные средства для создания собственных GUI. Ведь понятно, что делать готовые скины никто не будет - это невыгодно как для разработчиков, так и для них.


По поводу QStyle. Смотри пример demos/shared/arthurstyle.cpp. Обрати внимание на функцию

Код:
void ArthurStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) 


В ней есть кусок кода в котором они рисуют "свой" слайдер.


Название: QSlider
Отправлено: pakulo от Июнь 02, 2007, 16:16
не вижу ничего сложного в прорисовке своего контрола, тебе же не нужно разрабатывать его функциональность? да и функциональность несложная тут...

открой исходники куте, найди QSlider.cpp или как там, и посмотри paintEvent. Уверен код там не больше 10 строчек.


Название: QSlider
Отправлено: goer от Июнь 02, 2007, 16:38
Думаю что у QSlider-а paintEvent вообще не переопределен. Все зарыто в стилях.


Название: QSlider
Отправлено: pakulo от Июнь 02, 2007, 17:26
А зачем думать? Берем да смотрим исходники


    QPainter p(this);
    QStyleOptionSlider opt = d->getStyleOption();

    opt.subControls = QStyle::SC_SliderGroove | QStyle::SC_SliderHandle;
    if (d->tickPosition != NoTicks)
        opt.subControls |= QStyle::SC_SliderTickmarks;
    if (d->pressedControl) {
        opt.activeSubControls = d->pressedControl;
        opt.state |= QStyle::State_Sunken;
    } else {
        opt.activeSubControls = d->hoverControl;
    }

    style()->drawComplexControl(QStyle::CC_Slider, &opt, &p, this);

Унаследовал клас, потом переопределяешь paintevent(). и Там рисуешь вот по примеру свою версию слидера.

добавлено спустя 1 минуту:

 А вот функция которая возвращает опции стиля твоего слидера, ее изменять по ходу не нужно.

QStyleOptionSlider QSliderPrivate::getStyleOption() const
{
    Q_Q(const QSlider);
    QStyleOptionSlider opt;
    opt.init(q);
    opt.subControls = QStyle::SC_None;
    opt.activeSubControls = QStyle::SC_None;
    opt.orientation = orientation;
    opt.maximum = maximum;
    opt.minimum = minimum;
    opt.tickPosition = (QSlider::TickPosition)tickPosition;
    opt.tickInterval = tickInterval;
    opt.upsideDown = (orientation == Qt::Horizontal) ?
                     (invertedAppearance != (opt.direction == Qt::RightToLeft))
                     : (!invertedAppearance);
    opt.direction = Qt::LeftToRight; // we use the upsideDown option instead
    opt.sliderPosition = position;
    opt.sliderValue = value;
    opt.singleStep = singleStep;
    opt.pageStep = pageStep;
    if (orientation == Qt::Horizontal)
        opt.state |= QStyle::State_Horizontal;
    return opt;
}

добавлено спустя 3 минуты:

 Но тут есть проблема, в куте много методов и членов обьявленны как приват, поэтому ты не сможешь получить у унаследованого класса доступ к ним, но может можно будет обойтись методами обьявлеными как паблик, тогда замени в ф-е QSliderPrivate::getStyleOption на новые методы, ибо оно не найдет приватовские... Если не выйдет, то тогда бери создавай свой слидер вообще, откываешь исходники копируешь и начинаешь добавлять/изменять что тебе нужно. Займет макс день, но зато сделаешь свой контрол :)


Название: QSlider
Отправлено: Kosh от Июнь 04, 2007, 09:29
Может тебя такой слайдер устроит ?
http://docs.huihoo.com/qwt/class_qwt_slider.html
где скачать, смотри на главной странице