Help reqested: very simple keypressevent in mainwindow
-
wrote on 28 Apr 2013, 20:44 last edited by
Hello
I've been trying to add a basic keyboard input handler to my mainwindow. The mainwindow has a few Qlabels and pushbuttons, nothing fancy.
I've tried adding the following code:
mainwindow.h
@ protected:
void keyPressEvent(QKeyEvent *event);@mainwindow.cpp
@ void MainWindow::keyPressEvent(QKeyEvent *event)
{
std::cout << "pressed";
}@But nothing happens when I press a key. I think there's something very simple that I'm missing, but I just can't figure it out. Trust me I've googled quite a bit on the topic but got nowhere. Any help would be greatly appreciated. Thanks.
-
Hi and welcome to devnet,
What is your MainWindow ? A QWidget ? A QMainWindow ?
Does it get keyboard focus ?
Typically, if your one of your pushbuttons has the focus, your MainWindow won't receive any keyboard event
-
wrote on 28 Apr 2013, 22:06 last edited by
Thanks for the reply.
My mainwindow class inherits from QMainWindow, and yes indeed, the very first pushbutton appears to receive focus by default.
Can you tell me what I need to run in order for the overall mainwindow to receive universal focus(if that makes sense).
-
It doesn't really make sense (I.E. if you have QLineEdit, you'd rather want it to have the keyboard focus)
You can however use your MainWindow as a filter, search for event filter in the documentation.
Why do you need that "universal focus" ?
-
wrote on 28 Apr 2013, 22:25 last edited by
I looked through the eventfilter documentation, and as I understand the filter must be added to an existing object. I'm not sure how that would work for me because I want the program to just catch keyboard input in general. It doesn't have to be tied to a specific control or GUI element.
Basically the program is open and running.
The user presses a key.
The program should catch this input and go from there. -
What kind of key ? A short cut ?
From what "state" to what "state" ?
You can filter events for several widgets in the same filter event
-
wrote on 28 Apr 2013, 22:37 last edited by
Ah ok I think I'm not elaborating enough.
Basically my program is an extremely simple game.
There is a qlabel with a car image.
When the user presses an arrow key, the car-image label should be moved in an appropriate direction. My entire program consists of nothing but a main file, mainwindow.h inhering from qmainwindow, and the mainwindow.cpp. I'm not using widgets or anything like that.
This is purely conceptual at this point. I just want the program to be open, the user to press a key, the program to read this and then move the car. I don't know how to explain it any simpler lol.
Maybe if I just added my code...
@#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPushButton>
#include <QMessageBox>
#include <QPixmap>
#include <QLabel>
#include <QTimer>
#include <QTextEdit>
#include <QInputDialog>
#include <QString>
#include <QEvent>
#include <QObject>
#include <QKeyEvent>//class GUITile;
class MainWindow : public QMainWindow {
Q_OBJECTpublic:
explicit MainWindow();void show();
protected:
void keyPressEvent(QKeyEvent *event);private:
QString name;
int roadSpeed;
int score;
int speed;
int lives;int roadTimerCount;
bool gameRunning;
bool timerRunning;QGraphicsScene *scene; QGraphicsView *view;
QLabel *nameLabel;
QTextEdit *scoreField;QTextEdit *speedField;
QTextEdit *livesField;QPushButton *startButton;
QPushButton *pauseButton;
QPushButton *exitButton;
QPushButton *aboutButton;QMessageBox *aboutBox;
QPixmap *cityMap;
QLabel *city;QPixmap *roadMap;
QLabel *road;QPixmap *roadMap2;
QLabel *road2;QPixmap *playerMap;
QLabel *player;QTimer *roadTimer;
private slots:
void startSlot();
void pauseSlot();
void exitSlot();void aboutSlot();
void handleRoadTimer();
};
#endif
@And in mainwindow.cpp:
@ void MainWindow::keyPressEvent(QKeyEvent *event)
{
std::cout << "pressed";
//just to test basic input. the actual event will be filtering for the arrow keys and space bar
}@ -
Ok ! I see, then i think "grabKeyboard":http://qt-project.org/doc/qt-4.8/qwidget.html#grabKeyboard is your friend
-
wrote on 29 Apr 2013, 10:33 last edited by
Will an installEventFilter help here?
Here's some code which might help.
In the constructor
@
installEventFilter(this)
@and then a function
@
bool MainWindow::eventFilter(QObject *target, QEvent *event) {if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); switch (keyEvent->key()) { case <whatever key you want>: } return QObject::eventFilter(target, event); }
}
@Here, the key you wish to map can be specified as
@
Qt::Key_Up
Qt::Key_A
.
.
etc
@Hope this is what you were looking for!
4/9