Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перехватить событие от колеса
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
Анна
Задача такая:
Есть: внутри QScrollArea длинный виджет с кучей дочерних виджетов, у которых в свою очередь есть дочерние QSpinBox (вложенность виджетов в общем случае большая).
Нужно: чтобы при вращении колеса осуществлялась только прокрутка длинного виджета в QScrollArea.
Проблема: при прокрутке длинного виджета, если курсор мыши попадает в QSpinBox, прокрутка прекращается и начитает меняться значение QSpinBox.

Перехват в eventFilter() события колеса только для длинного виджета не помогает.
Алексей1153
Анна, для начала можно попробовать всем QSpinBox выключить фокус по колесу

QSpinBox* p=...;
p->setFocusPolicy(Qt::ClickFocus)


и для поиска всех виджетов может пригодиться
findChildren<QSpinBox*>();

Анна
Цитата(Алексей1153 @ 17.3.2017, 14:44) *
Анна, для начала можно попробовать всем QSpinBox выключить фокус по колесу

QSpinBox* p=...;
p->setFocusPolicy(Qt::ClickFocus)


и для поиска всех виджетов может пригодиться
findChildren<QSpinBox*>();


Фокус с setFocusPolicy не проходит. У меня иногда складывается впечатление, что никакой разницы между этими флажками нет.
Как только мышка оказывается над QSpinBox, он перехватывает события от колеса.

За findChildren() спасибо. Я как раз на что-нибудь похожее надеялась, только найти не смогла.
Алексей1153
Анна, поэкспериментировал.

setFocusPolicy(Qt::ClickFocus) работает прекрасно в том смысле, что реально не ставит фокус при вращении колеса над спином. Однако спин всё равно меняет значение. Вылечил так

CMyWidget::CMyWidget()
{
...
    ui->spinBox->setFocusPolicy(Qt::ClickFocus);//фокус на спин можно установить только кликом
    ui->spinBox->installEventFilter(this);//сообщение колеса обработаем
}


//сообщение колеса обработаем
bool CMyWidget::eventFilter(QObject* o, QEvent* e)
{
    if(o==ui->spinBox && e->type()==e->Wheel)
    {
        if(!ui->spinBox->hasFocus())
        {
            e->ignore();
            return true;
        }
    }


    return QDialog::eventFilter(o,e);
}


то есть, при помощи findChildren тебе нужно настроить все спины и там, где у меня "o==ui->spinBox" уточнять, что обрабатывается спин, лежащий там, где нужно
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2017 IPS, Inc.