Название: Помогите с перехватом клавиш! Отправлено: Ak_Robat от Ноябрь 23, 2013, 20:15 Вопрос собственно такой: как при нажатии некоторых клавиш выполнять определённые процедуры.
Немного поясню. Если активно окно приложения, то нажатие клавиш должно прехватываться (не зависимо от виджета в фокусе). Я перерыл немало форумов, но это мне совсем не помогло (не из-за отсутствия полезной инфы, скорее из-за моей неопытности в qt creator, знаю пока мало библиотек и много незнакомых методов для меня). Вот то, что я нашёл в учебнике: Код: void MyWidget::keyPressEvent(QKeyEvent* pe) { Компилятор ругается на MyWidget (вроде вполне логично) и я понятия не имею где его нужно объявить. Пробовал объявить его в хедере, пробовал подключать "QKeyEvent", "QEvent", "QtGui" - исход один и тот же. Всё что нужно это чтоб знающий человек объяснил какой код в какой файл вписать, дальше я разберусь. Название: Re: Помогите с перехватом клавиш! Отправлено: gil9red от Ноябрь 23, 2013, 20:43 Делаем так:
Код: h: Код
cpp: Код
И не нужно писать таким здоровым шрифтов ;) Название: Re: Помогите с перехватом клавиш! Отправлено: lit-uriy от Ноябрь 24, 2013, 00:56 Вам помогут:
QAction QShortcut QKeySequence А использовать обработчики событий имеет смысл только в случае невозможности достичь нужного результата выше указанными классами Название: Re: Помогите с перехватом клавиш! Отправлено: Ak_Robat от Ноябрь 24, 2013, 16:29 Большое Спасибо, gil9red, за помощь, всё компилируется.
Но мне не удалось затестить корректность работы, т.к. возникла днугая (совершенно неожиданная) проблема. Фактически при нажатии клавиши мне нужно вызвать событие ON_CLICKED уже существующей кнопки. Оказалось реализовть это в qt не так-то просто. Как обратиться к форме и её виджетам из глобальной области? Помогите ещё раз пожалуйста. Необходимо сделать что-то вроде: Код: case Qt::Key_Backspace: p.s. в заголовке изменил строки: Код: private: Код: public: Название: Re: Помогите с перехватом клавиш! Отправлено: gil9red от Ноябрь 24, 2013, 23:43 Чтобы программно кликнуть на кнопку, можно у кнопки вызвать метод click():
// Если предположить что objectName вашей кнопки butBacks, то: Код
// Если кнопка должна при нажатии выполнить слот on_butBacks_clicked() и этот слот вам нужно вызвать, то: Код
А лучше всего кидать кода побольше, тут не телепаты сидят ;) :) Название: Re: Помогите с перехватом клавиш! Отправлено: Ak_Robat от Ноябрь 25, 2013, 17:26 Цитировать // Если предположить что objectName вашей кнопки butBacks, то: Код: case Qt::Key_Backspace: Да, это именно то, что нужно, но суть в том, что я вызываю функцию on_butBacks_clicked() из глобальной области cpp (а именно из метода keyPressEvent моего собственного класса MyWidget), поэтому эта функция не распознаётся. Код: void MyWidget::keyPressEvent(QKeyEvent *event) { Вопрос в том как корректно обратиться к форме и её виджетам из вне? (т.к. ни указатель ui, ни w [объект класса MainWindow, описанный в main.cpp] тоже почему-то не опознаны там) Например в том же C++ Builder это бы выглядело так: Код: case Qt::Key_Backspace: А как реализовать то же самое в Qt? ps. main.cpp: Код: #include "mainwindow.h" Название: Re: Помогите с перехватом клавиш! Отправлено: ViTech от Ноябрь 25, 2013, 17:55 Да, это именно то, что нужно, но суть в том, что я вызываю функцию on_butBacks_clicked() из глобальной области cpp (а именно из метода keyPressEvent моего собственного класса MyWidget), поэтому эта функция не распознаётся. Не нужно вызывать on_butBacks_clicked() из глобальной области cpp. И обработчик нажатия на кнопку откуда либо вообще :). Нужно сделать слот, который выполняет необходимые действия, а к нему подключать сигналы от кнопок, действий, сочетаний клавиш.Вопрос в том как корректно обратиться к форме и её виджетам из вне? (т.к. ни указатель ui, ни w [объект класса MainWindow, описанный в main.cpp] тоже почему-то не опознаны там) Например в том же C++ Builder это бы выглядело так: ... К виджетам формы, по-хорошему, тоже обращаться не нужно. То, что находится на форме - ее внутреннее дело. Взаимодействовать с внешними объектами она должна по другому. Изучайте простые примеры на Qt. Например, что быстро нагуглилось: http://open-life.org/blog/QT/295.html http://code-live.ru/post/getting-started-qt |