Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Помогите приручить QSlider


Автор: Jeka178RUS 22.4.2013, 12:56
Добрый день! На форме создан вертикальный слайдер, tracking выключен. В таком случае при изменении положения слайдера мышью испускается сигнал sliderMoved(), а при отпускании клавиши мыши valueChanged(), что позволяет реализовать "пред просмотр" при slider moved и само действие при value changed. Однако есть проблема если изменять положение слайдера при помощи клавиатуры испускается только value changed, при этом не имеет значение удерживаю я клавишу или нажимаю много раз, что, в моем понимании, расходится с логикой управления мышью.  

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

Код

bool CSliderEventFilter::eventFilter(QObject *obj, QEvent *evt)
{
    QSlider* slider = dynamic_cast<QSlider*>(obj);
    if ( slider == nullptr )
        return false;

    QKeyEvent* keyEvt = dynamic_cast<QKeyEvent*>(evt);
    if ( keyEvt == nullptr )
        return false;

    switch (keyEvt->type()) {
    case QKeyEvent::KeyPress:
        qDebug() << "move slider";
    break;

    case QKeyEvent::KeyRelease:
        qDebug() << "change value";
    break;

    default:
    break;
    }

    return true;
}


При такой реализации я получаю оба события press и release даже если удерживаю клавишу, что поставило меня в тупик. Подскажите в какую сторону копать чтобы приручить слайдер?

Автор: Jeka178RUS 22.4.2013, 13:15
Вспомнил: достаточно проверить  keyEvt->isAutoRepeat()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)