crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Переопределение функции keyPressEvent для определенного виджета
kwisp
  опции профиля:
сообщение 24.3.2010, 11:33
Сообщение #11


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(AD @ 24.3.2010, 11:24) *
Я хочу виджету, в котором находится карта, переопределить функцию keyPressEvent, чтобы при нажатии на +/- масштаб менялся, а при нажатии на стрелки - происходило передвижение по карте.

ясно. Внимание вопрос.
нажатия буду происходить:
а) фокус ввода всегда на карте
б) может быть на карте а может и нет
в) всегда не на карте
???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 24.3.2010, 11:54
Сообщение #12


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


б)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 24.3.2010, 12:24
Сообщение #13


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


теперь ясно почему используешь eventFilter().
непонятно чего ты добиваешься этим кодом
Раскрывающийся текст
Цитата
bool T::eventFilter(QObject* object, QEvent* events)
{
    bool p1 = (object == tabTopoView -> chartWidget() || object == tabUniView -> chartWidget() ||
        object == tabMarineView -> chartWidget() || object == tabLibView -> chartWidget());

    if((object == tabTopoView -> chartWidget() || object == tabUniView -> chartWidget() ||
        object == tabMarineView -> chartWidget() || object == tabLibView -> chartWidget()) &&
        events -> type() == QEvent::KeyPress)
    {
        QKeyEvent* key_events(static_cast<QKeyEvent*> (events));
        switch(key_events -> key())
        {
        case Qt::Key_Plus:
            p1 = false;
        break;
        case Qt::Key_Minus:
        break;
        }
        return QMainWindow::eventFilter(object, events);
    }
    
    return QMainWindow::eventFilter(object, events);
}

зачем
Цитата
if((object == tabTopoView -> chartWidget() || object == tabUniView -> chartWidget() ||
object == tabMarineView -> chartWidget() || object == tabLibView -> chartWidget())

вот эта проверка если у тебя фильтр заточен под конкретную задачу. для тебя же нет разницы в какой виджет передали "+/-" -- гланое что было событие нажатия клавиши и клавиша эта + или -. получается это лишнее.

далее неясно вообще назначение локальной переменной bool p1. ты меняешь размеры её значение с какой целью непонятно. при выходе из локальной области видимости она разрушается.
тебе по можно либо напрямую в фильтре событий менять масштаб в case : Qt::Key_Plus и case : Qt::Key_Minus либо высылать к примеру специальный сигнал об увеличении/уменьшении масштаба.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 24.3.2010, 12:42
Сообщение #14


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(kwisp @ 24.3.2010, 12:24) *
далее неясно вообще назначение локальной переменной bool p1. ты меняешь размеры её значение с какой целью непонятно. при выходе из локальной области видимости она разрушается.
тебе по можно либо напрямую в фильтре событий менять масштаб в case : Qt::Key_Plus и case : Qt::Key_Minus либо высылать к примеру специальный сигнал об увеличении/уменьшении масштаба.

Да эта переменная была создана, так скажем, просто для проверки, что функция входит в данное условие. Естественно, позднее я собирался ее заменить полезным кодом. Повторюсь, что при нажатии на кнопки в эту функцию вообще не попадает дебаггер.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 24.3.2010, 12:50
Сообщение #15


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


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

извиняюсь. даже в функцию не попадает? т.е в eventFiler() ?
тогда следи где находится фокус ввода и правильно ли установлены фильтры(правильно ли перопределен прототип функции)? попробуй проверить глобальный фильтр.

попробуй изменяя фокус ввода, проверить вызывается ли функция eventFilter() ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 24.3.2010, 13:00
Сообщение #16


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(kwisp @ 24.3.2010, 12:50) *
подозревают мешают проверки о которых я говорил. попробуй убери их.
чем в дебагер смотреть не проще вести лог?

извиняюсь. даже в функцию не попадает? т.е в eventFiler() ?
тогда следи где находится фокус ввода и правильно ли установлены фильтры(правильно ли перопределен прототип функции)? попробуй проверить глобальный фильтр.

попробуй изменяя фокус ввода, проверить вызывается ли функция eventFilter() ?

Убрал проверки, не помогло. В eventFilter входит, конечно же. Не входит в первое условие
if(events -> type() == QEvent::KeyPress)
{
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 24.3.2010, 13:08
Сообщение #17


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


AD,
остается фокус ввода.
что дает его изменение и нажатие на +/- ?
на каком виджете находится фокус ввода при "не заходит в условие"
смотрел глобальный фильтр событий?

П.С. предлагаю тему переименовать.
"Установка фильтра собтий в множество виджетов" или подобное.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 24.3.2010, 15:38
Сообщение #18


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(kwisp @ 24.3.2010, 13:08) *
AD,
остается фокус ввода.
что дает его изменение и нажатие на +/- ?
на каком виджете находится фокус ввода при "не заходит в условие"
смотрел глобальный фильтр событий?

В виджете, на который я хочу поставить фокус, в конструкторе, вызываю слот setFocus(). Все-равно не помогает. Нажатия на клавиши не отлавливаются.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 25.3.2010, 8:27
Сообщение #19


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(AD @ 24.3.2010, 15:38) *
В виджете, на который я хочу поставить фокус, в конструкторе, вызываю слот setFocus(). Все-равно не помогает. Нажатия на клавиши не отлавливаются.

не так дело не пойдёт.
от куда ты знаешь где фокус будет после создания окна нажатия на кнопки мыши и таб.?
что с глобальным фильтром событий?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 25.3.2010, 9:59
Сообщение #20


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(kwisp @ 25.3.2010, 8:27) *
от куда ты знаешь где фокус будет после создания окна нажатия на кнопки мыши и таб.?
что с глобальным фильтром событий?

Можно по русски? Прости, нифига не понял. Какой глобальный фильтр событий? Где он должен быть? Как его вызвать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 25.4.2024, 23:22