LINUX.ORG.RU

не ловит нажатия стрелок

 ,


0

1

Чертовщина: ловит абсолютно ЛЮБЫЕ клавиши кроме стрелок. Пробовал и на Qt 4 и на Qt 5.3.2 и даже Qt 5.4.0 - ну вот что я делаю не так??? Дошел уже до ручки - убрал всё из формы, только пара кнопок осталась. А так пустой почти проект. В общем, вызываются ОБА обработчика на любые клавиши, но не на стрелки! Почему, кто виноват, что делать? У всех такие траблы?

bool my_shit_class::event(QEvent *event)
{
	if(event->type() == QEvent::KeyPress)
	{
		QKeyEvent *ke = static_cast<QKeyEvent*>(event);
		qDebug() << "### pressed" << (int)ke->key();
		if(ke->key() == Qt::Key_Up)
		{
			qDebug() << "pressed Up";
			return true;
		}
	}
	return QWidget::event(event);
}

void my_shit_class::keyPressEvent(QKeyEvent *event)
{
	qDebug() << "*** pressed" << (int)event->key();
}

P.S. Еще TAB не ловит, а так всегда:

### pressed 49 
*** pressed 49 
### pressed 50 
*** pressed 50 
### pressed 51 
*** pressed 51 
### pressed 16777249 
*** pressed 16777249 
### pressed 16777248 
*** pressed 16777248 
### pressed 1040 
*** pressed 1040 
### pressed 1042 
*** pressed 1042 
### pressed 1067 
*** pressed 1067 
### pressed 1040 
*** pressed 1040

★★★★★

Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

значит какой-то виджет первее тебя забирает событие. попробуй ловить с помощью eventFilter на qApp

dib2 ★★★★★
()
Ответ на: комментарий от peregrine

Ну так елы палы, я ж так и делаю, например как в «два». У меня именно что фильтр эвентов на самом верхнем виджете. Что может забирать ввод? Я гуглил и вижу всё это, не помогает. Пытаюсь понять что я не учел, какую мелочь?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Фокус стоит на том виджете, на который повешена ловля клавиш? Его точно никто не отбирает? Если принудительно сделать setFocus, то тоже не будет работать?

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Завтра попробую. Интересная мысль, надо проверить... И как бы сделать глобальный фильтр евентов - погуглю пожалуй. Мне надо перехват над всем приложением - я должен отметить для себя что клавиша, например стрелка вверх, была нажата и передать дальше.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Спрятал кнопки с формы (их всего две было) - сразу стали стрелочки ловиться...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от dib2
	QApplication a(argc, argv);
	key_filter kf;
	a.installEventFilter(&kf);
class key_filter : public QObject
{
	Q_OBJECT
public:
	explicit key_filter(QObject *parent = 0);

protected:
	bool eventFilter(QObject *obj, QEvent *event);

signals:
	void sig_key_up();
};
bool key_filter::eventFilter(QObject *obj, QEvent *event)
{
	if(event->type() == QEvent::KeyPress)
	{
		QKeyEvent *ke = static_cast<QKeyEvent*>(event);
		if(ke->key() == Qt::Key_Up) emit sig_key_up();
	}
	return QObject::eventFilter(obj, event);
}
I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от dib2

Вот так работает. Просто странно что какие-то компоненты глотают такой эвент не думая что он может быть еще кому-то нужен. Особенно если в главном окне эвент-хэндлер ловлю. Странно всё это, но хорошо что я нашел такой способ 100% рабочий.

Проблема решена.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Особенно если в главном окне эвент-хэндлер ловлю

главное окно лежит ниже по приоритету чем его содержимое, все верно. Windows.Forms для этой цели содержали костыль под названием KeyPreview

dib2 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.