Название: Обработка событий клавиатуры (Проблема решена) Отправлено: begin от Август 04, 2010, 13:59 Только начинаю изучать Qt.
Создаю окно, в котором расположены 20 одинаковых ячеек. С этим проблем не возникло. Теперь хочу сделать так, чтобы по нажатию кнопок A и B на клавиатуре менялись свойства рядов ячеек. Кнопки нажимаю, но ничего не происходит. Почему - не понимаю. Подскажите. prog.cpp Код: #include <QApplication> Код: #ifndef BASICMENU_H Код: #include <QKeyEvent> Код: #ifndef CELL_H Код: #include "cell.h" Название: Re: Обработка событий клавиатуры Отправлено: Anarion от Август 04, 2010, 14:54 Судя по всему, в фокусе ввода с клавиатуры находится внутренний виджет, объект класса Cell. Проверил это переопределив для класса Cell событие keyPressEvent(). Причем в виджет Basicmenu, который и должен (по замыслу) обрабатывать нажатие, событие нажатия не попадает вообще.
На вскидку 2 решения: 1) Заставить обрабатывать событие родительский виджет класса Basicmenu (хз, как) 2) Посылать от Cell'ов сигнал о нажатии виджету Basicmenu, предварительно соединив со слотом, в котором и обрабатывать нажатия клавиш. Название: Re: Обработка событий клавиатуры Отправлено: begin от Август 04, 2010, 15:13 Насчет второго варианта - это вариант, как говорится, в лоб. Скорее всего получится, но это будет не очень красиво.
А вот как можно в этом случае перевести фокус ввода на Basicmenu? Название: Re: Обработка событий клавиатуры Отправлено: SASA от Август 04, 2010, 15:52 Создайте экшен и повесте на него горячую клавишу.
З.Ы. Не пользуьтесь магическими константами типа 0x41. В КуТэ есть перечисления со всеми клавишами. Название: Re: Обработка событий клавиатуры Отправлено: begin от Август 04, 2010, 15:59 Создайте экшен и повесте на него горячую клавишу. Если можно - более развернуто. Не очень понял вашу мысль.З.Ы. Не пользуьтесь магическими константами типа 0x41. В КуТэ есть перечисления со всеми клавишами. Насчет "магических констант" - а чем плохо их использовать? Название: Re: Обработка событий клавиатуры Отправлено: Anarion от Август 04, 2010, 16:39 На сколько понимаю, самым первым событие нажатия клавиши получает QMainWindow *window = new QMainWindow;
Поэтому, как вариант, можно унаследоваться от него и уже в нем обрабатывать все нажатия или же делать экшены (QAction). В нем же и создавать остальные объекты, например тот же chiOfBasicMenu = new Basicmenu(window); Если делать без наследования: 1) экшн надо добавлять в объект chiOfBasicMenu, но т.к. фокус он не получает, то экшн не отработает. 2) если добавлять экшн в window, то надо будет с чем-то соединять сигналы-слоты от экшенов, что без наследования врядли удасться. Название: Re: Обработка событий клавиатуры Отправлено: begin от Август 04, 2010, 16:42 На сколько понимаю, самым первым событие нажатия клавиши получает QMainWindow *window = new QMainWindow; Странно, а в книге по Qt нашл вот такой абзац:"Большинство типов событий, включая события от мыши и клавиатуры, могут передаваться дальше. Если событие не было обработано по пути к объекту наначения, или самим объектом, то процесс обработки события повторяется, но на этот раз объектом назначения становится виджет-владелец. Так продолжается до тех пор, пока событие не будет обработано, либо пока событие не достигнет виджет самого верхнего уровня." Может быть все-таки наоборот, сначала событие получает самый младший? Название: Re: Обработка событий клавиатуры Отправлено: Anarion от Август 04, 2010, 19:55 Да, Вы правы (признаю свою ошибку). Можно сделать таким образом:
main.cpp Код: #include <QApplication> mainwindow.h Код: #ifndef MAINWINDOW_H mainwindow.cpp Код: #include "mainwindow.h" basicmenu.h Код: #ifndef BASICMENU_H basicmenu.cpp Код: #include "basicmenu.h" cell.h Код: #ifndef CELL_H cell.cpp Код: #include "cell.h" При нажатии клавишь в дебаг будет выводиться ---------- 3 1 ---------- Но "2" (признак попадания в объект Basicmenu) не будет. Название: Re: Обработка событий клавиатуры Отправлено: begin от Август 05, 2010, 06:17 Но насколько я понимаю, это всего лишь доказывает, что Basicmenu не получает событие нажатия кнопки. Но при этом не решает мою проблему.
Так как же ее решить? Название: Re: Обработка событий клавиатуры Отправлено: Anarion от Август 05, 2010, 10:12 Я предложил же здесь решение.
1) Наследуешься от QMainWindow. 2) В унаследованном классе создаешь объект класса Basicmenu Код: class MainWindow : public QMainWindow 3) Дальше все также как делал ты. События изначально попадают в объекты класса Cell, там не обрабатываются и отсылаются в виджет верхнего уровня, т.е. в объект класса MainWindow (унаследованный). И уже тут, поскольку в классе MainWindow есть объект класса Basicmenu, вызываешь необходимые методы его же: Код: void MainWindow::keyPressEvent(QKeyEvent *event) Также ты создаешь объекты класса Cell внутри QGroupBox. Возможно он перехватывает сообщения и не отправляет дальше. Название: Re: Обработка событий клавиатуры Отправлено: begin от Август 05, 2010, 10:38 Спасибо большое за ответы. Разобрался с фильтрами событий и сделал через него. Будет свободное время - попробую ваш вариант. Еще разх спасибо за помощь.
Название: Re: Обработка событий клавиатуры Отправлено: SASA от Август 05, 2010, 11:54 Цитировать Насчет "магических констант" - а чем плохо их использовать? Сравните Qt::Key_A и 0x41. Что более понятно?Название: Re: Обработка событий клавиатуры Отправлено: begin от Август 05, 2010, 13:54 Цитировать Насчет "магических констант" - а чем плохо их использовать? Сравните Qt::Key_A и 0x41. Что более понятно? |