Tastendruck auswerten

Alles rund um die Programmierung mit Qt
Antworten
cyliax
Beiträge: 5
Registriert: 22. März 2007 11:23

Tastendruck auswerten

Beitrag von cyliax »

Hallo,

ich möchte in meinem Programm einfach einen Tastendruck auswerten und dann über SIGNAL, SLOT eine Aktion ausführen. Leider finde ich nicht den richtigen Weg, ist aber sicherlich ganz einfach:

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{
	connect(this,SIGNAL(keyPressed()),this,SLOT(checkGame()));
}

void MainWindow::checkGame()
{
	QMessageBox::information(this, "Taste", "Gedrückt");
}
... so gehts schonmal nicht, bringt aber auch keinen Fehler. Wie macht man es besser?

Danke im Voraus!

cyx

PS: Welche Taste gedrückt wurde ist eigentlich erstmal Wurst, dafür wäre es schon, die Aktion erst beim Release (also Loslassen der Taste) auszuführen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was für einen Tastendruck? Der für das MainWidget oder global oder für alle Widgets deiner App?
Da es kein Signal keyPressed() gibt, kann es nunmal nicht funktionieren...

Siehe z.B. hier:
http://doc.trolltech.com/4.2/qwidget.html#keyPressEvent
http://doc.trolltech.com/4.2/qwidget.html#grabKeyboard
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Vermutlich musste du da mit einem Eventfilter ran und auf das Ereignis QEvent::KeyRelease/QEvent::KeyPress filtern.
cyliax
Beiträge: 5
Registriert: 22. März 2007 11:23

Beitrag von cyliax »

ok, habe das mal mit diesem eventfilter versucht. nach meiner logik müßte es so eigentlich gehen, das programm läßt sich fehlerfrei compilieren und linken und starten, nur lande ich sofort wieder auf der konsole ohne das irgendwas sichtbar wird.

also was habe ich gemacht:

Code: Alles auswählen

class MainWindow : public QMainWindow, private Ui::MainWindow
{
	Q_OBJECT
	
	protected:
		bool eventFilter(QObject *o, QEvent *e);
};

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{
	installEventFilter(this);
}

bool MainWindow::eventFilter( QObject *o, QEvent *e)
{
	if ( e->type() == QEvent::KeyPress )
	{
		QMessageBox::information(this, "Result", "true");
		return true;
	}
	else
	{
		QMessageBox::information(this, "Result", "false");
		return false;
	}
	//return true;
}
Hab ich was vergessen oder wo liegt der fehler?

Danke euch schonmal.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie wärs mit ner Oberfläche?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
cyliax
Beiträge: 5
Registriert: 22. März 2007 11:23

Beitrag von cyliax »

naja ne oberfläche und so hab ich schon, die hab ich mit dem designer gebastelt und die wird per setupUi(this); aufgerufen. das programm läuft ansich schon so wie es soll, nur will ich bei jedem tastendruck (also wenn das programm im vordergrund ist) was überprüfen und dazu wollte ich das halt irgendwie abfangen.

der code war jetzt also nur ein auszug...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

cyliax hat geschrieben:naja ne oberfläche und so hab ich schon, die hab ich mit dem designer gebastelt und die wird per setupUi(this); aufgerufen.
Wenn sich das Programm wieder schliesst, glaube ich das nicht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
cyliax
Beiträge: 5
Registriert: 22. März 2007 11:23

Beitrag von cyliax »

wenn ich den if-else-block in meiner eventfilter funktion auskommentiere, dann startet es ganz normal, sobald mein if-block wieder drin ist, dann schließt es sich sofort wieder ohne das ich was sehe. verstehe auch nicht so ganz, was die if-geschichte mit dem generelle start des programms zu tun hat. vorallem ohne jegliche fehlermeldung.

danke übrigens für deine mithilfe!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ok, die Doku, aus der Du den Code kopiert hast ist hier falsch. Aber es steht im Text: "The eventFilter() function must return true if the event should be filtered, (i.e. stopped); otherwise it must return false."
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
cyliax
Beiträge: 5
Registriert: 22. März 2007 11:23

Beitrag von cyliax »

ok, so scheint es so gehen, es lag an der 2. messagebox, aber die brauche ich ja da drin nicht unbedingt, das mit dem messageboxen war ja nur um schnell was zu sehen:

Code: Alles auswählen

bool MainWindow::eventFilter( QObject *o, QEvent *e)
{
	if ( e->type() == QEvent::KeyRelease )
	{
		QMessageBox::information(this, "Result", "true");
		return true;
	}
	else
		return false;
}
also danke dir erstmal christian
Antworten