crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Перехватить событие от колеса, [решено]
Анна
  опции профиля:
сообщение 17.3.2017, 13:52
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 290
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 25 раз(а)




Репутация:   4  


Задача такая:
Есть: внутри QScrollArea длинный виджет с кучей дочерних виджетов, у которых в свою очередь есть дочерние QSpinBox (вложенность виджетов в общем случае большая).
Нужно: чтобы при вращении колеса осуществлялась только прокрутка длинного виджета в QScrollArea.
Проблема: при прокрутке длинного виджета, если курсор мыши попадает в QSpinBox, прокрутка прекращается и начитает меняться значение QSpinBox.

Перехват в eventFilter() события колеса только для длинного виджета не помогает.

Сообщение отредактировал Анна - 17.3.2017, 15:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.3.2017, 14:44
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2923
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 202 раз(а)




Репутация:   35  


Анна, для начала можно попробовать всем QSpinBox выключить фокус по колесу

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


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



Сообщение отредактировал Алексей1153 - 17.3.2017, 14:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 17.3.2017, 15:29
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 290
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 25 раз(а)




Репутация:   4  


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

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


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


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

За findChildren() спасибо. Я как раз на что-нибудь похожее надеялась, только найти не смогла.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.3.2017, 22:59
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2923
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 202 раз(а)




Репутация:   35  


Анна, поэкспериментировал.

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" уточнять, что обрабатывается спин, лежащий там, где нужно

Сообщение отредактировал Алексей1153 - 17.3.2017, 23:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.3.2017, 2:31