Обработка нажатий клавиш (Qt)

Модератор: Модераторы разделов

Аватара пользователя
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora

Обработка нажатий клавиш

Сообщение Corsair »

Есть QLineEdit в который пользователь вводит текст. По нажатию энтера, с введенные текстом должны происходить определенные манипуляции.
Однако ничего не происходит. У меня подозрение, что событие обрабатывает не мой класс, а сам QLineEdit или кто-то из предков.
Выкурил кучу манов и перепробовал тонну способов это обойти, но ничего хорошего так и не получилось.
Для примера сварганил небольшой тестовый класс.

test.h

Код:

#ifndef TEST_H #define TEST_H #include <QWidget> class QLineEdit; class QHBoxLayout; class Test : public QWidget{ Q_OBJECT; public: Test(); private: QHBoxLayout *layout; QLineEdit *lineEdit; protected: void keyPressEvent(QKeyEvent *event); void mousePressEvent(QMouseEvent *event); }; #endif // TEST_H

test.cpp

Код:

#include <QtGui> #include "test.h" Test::Test(){ lineEdit = new QLineEdit; layout = new QHBoxLayout; layout ->addWidget(lineEdit); setLayout(layout); } void Test::keyPressEvent(QKeyEvent *event){ switch (event->key()) { case Qt::Key_Enter: lineEdit->setText("Enter Pressed"); break; case Qt::Key_Space: lineEdit->setText("Space Pressed"); break; default: QWidget::keyPressEvent(event); } } void Test::mousePressEvent(QMouseEvent *event) { switch (event->button()) { case Qt::LeftButton: lineEdit->setText("Left Mouse Button Pressed"); break; case Qt::RightButton: lineEdit->setText("Right Mouse Button Pressed"); break; case Qt::MidButton: lineEdit->setText("Middle Mouse Button Pressed"); break; default: QWidget::mousePressEvent(event); } }

main.cpp

Код:

#include <QApplication> #include "test.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Test w; w.show(); return a.exec(); }


Клики мышкой по окну работают, а внутки QLineEdit ничего не работает.
Пробовал eventFilter повесить:
test.cpp

Код:

#include <QtGui> #include "test.h" Test::Test(){ lineEdit = new QLineEdit; layout = new QHBoxLayout; layout ->addWidget(lineEdit); setLayout(layout); installEventFilter(this); } bool Test::eventFilter(QObject *, QEvent *event) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); if (keyEvent->key() == Qt::Key_Enter) { lineEdit->setText("Enter Pressed"); return true; } else return false; } return false; } void Test::keyPressEvent(QKeyEvent *event){ switch (event->key()) { case Qt::Key_Enter: lineEdit->setText("Enter Pressed"); break; case Qt::Key_Space: lineEdit->setText("Space Pressed"); break; default: QWidget::keyPressEvent(event); } } void Test::mousePressEvent(QMouseEvent *event) { switch (event->button()) { case Qt::LeftButton: lineEdit->setText("Left Mouse Button Pressed"); break; case Qt::RightButton: lineEdit->setText("Right Mouse Button Pressed"); break; case Qt::MidButton: lineEdit->setText("Middle Mouse Button Pressed"); break; default: QWidget::mousePressEvent(event); } }

Так же ноль эффекта.

В общем что-то я не догоню этот процесс. Объясните, пожалуйста, что не так.
Жестокий стоячий админ (с) коллега
Спасибо сказали:
Аватара пользователя
DiS
Сообщения: 296
ОС: Gentoo

Re: Обработка нажатий клавиш

Сообщение DiS »

Corsair писал(а):
10.12.2008 15:01
void Test::keyPressEvent(QKeyEvent *event){
switch (event->key()) {
case Qt::Key_Enter:
lineEdit->setText("Enter Pressed");

Qt::Key_Enter замените на Qt::Key_Return. Как перехватить Qt::Key_Space не знаю.
Могут помочь конструкции типа

Код: Выделить всё

qDebug()<<event->key();
.
Если правильно задать вопрос, то он сам по себе будет ответом.
Спасибо сказали:
Аватара пользователя
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora

Re: Обработка нажатий клавиш

Сообщение Corsair »

Черт! Неудачные клавиши я выбрал для своего первого обработчика=) Спасибо за замечание.
Тогда остается вопрос относительно обработки печатаемых символов в QLineEdit если я хочу обработать их сам, вместо вывода в него.
Кто знает, обьясните пожалуйста.
Жестокий стоячий админ (с) коллега
Спасибо сказали: