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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSlider  (Прочитано 11062 раз)
cipher
Гость
« : Май 31, 2007, 17:42 »

День добрый, подскажет кто из знающих как наваять вот такой slider



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



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

В 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?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Май 31, 2007, 21:29 »

смотри в сторону paintEvent()
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
pakulo
Гость
« Ответ #2 : Июнь 01, 2007, 07:44 »

Да, прийдется наверное самому прорисовать его.
Записан
cipher
Гость
« Ответ #3 : Июнь 01, 2007, 10:44 »

люди, вы понимаете какой это гемор самому ваять, да ни за что не поверю что QT не позволяет так делать. Блин не может быть
Записан
goer
Гость
« Ответ #4 : Июнь 01, 2007, 11:00 »

Еще как может :-)

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

Надо или менять библиотеку, или написать несложную процедуру рисования слайдера. Кстати с использованием стилей рисовать слайдер еще проще (т.к. там можно получить QRect ключевых областей слайдера - желобок, ползунок и т.д.)
Записан
cipher
Гость
« Ответ #5 : Июнь 01, 2007, 11:21 »

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


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

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

 а ... или может кто знает где можно дополнительные компоненты взять в сети. Должны же быть какие-то коллекции не стандартных control'ов. У меня чё-то поиск пока нифига не выдаёт
Записан
goer
Гость
« Ответ #6 : Июнь 01, 2007, 11:45 »

Бывают же люди... Такие не только микроскопом гвозди будут забивать, они еще будут возмущаться почему микроскоп забивает гвозди хуже молотка.

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


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


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


Больше времени потратишь на поиск низкокачественой либы которую потом все равно прийдется переписывать, чем напишешь код сам.
Записан
cipher
Гость
« Ответ #7 : Июнь 01, 2007, 11:49 »

При чём тут микроскоп, ну если ты контора которая ваяет кроссплатформенную GUI так делай её удобной. Ладно это приперательство ни к чему нас не приведёт.

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

Цитировать
Кстати с использованием стилей рисовать слайдер еще проще
Записан
goer
Гость
« Ответ #8 : Июнь 01, 2007, 11:58 »

Цитировать
При чём тут микроскоп, ну если ты контора которая ваяет кроссплатформенную GUI так делай её удобной.


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


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

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


В ней есть кусок кода в котором они рисуют "свой" слайдер.
Записан
pakulo
Гость
« Ответ #9 : Июнь 02, 2007, 16:16 »

не вижу ничего сложного в прорисовке своего контрола, тебе же не нужно разрабатывать его функциональность? да и функциональность несложная тут...

открой исходники куте, найди QSlider.cpp или как там, и посмотри paintEvent. Уверен код там не больше 10 строчек.
Записан
goer
Гость
« Ответ #10 : Июнь 02, 2007, 16:38 »

Думаю что у QSlider-а paintEvent вообще не переопределен. Все зарыто в стилях.
Записан
pakulo
Гость
« Ответ #11 : Июнь 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 на новые методы, ибо оно не найдет приватовские... Если не выйдет, то тогда бери создавай свой слидер вообще, откываешь исходники копируешь и начинаешь добавлять/изменять что тебе нужно. Займет макс день, но зато сделаешь свой контрол Улыбающийся
Записан
Kosh
Гость
« Ответ #12 : Июнь 04, 2007, 09:29 »

Может тебя такой слайдер устроит ?
http://docs.huihoo.com/qwt/class_qwt_slider.html
где скачать, смотри на главной странице
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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