Seite 1 von 1

Tastendruck auswerten

Verfasst: 22. März 2007 11:27
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.

Verfasst: 22. März 2007 11:49
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

Verfasst: 22. März 2007 11:56
von BartSimpson
Vermutlich musste du da mit einem Eventfilter ran und auf das Ereignis QEvent::KeyRelease/QEvent::KeyPress filtern.

Verfasst: 22. März 2007 13:04
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.

Verfasst: 22. März 2007 13:09
von Christian81
Wie wärs mit ner Oberfläche?

Verfasst: 22. März 2007 13:14
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...

Verfasst: 22. März 2007 13:20
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.

Verfasst: 22. März 2007 13:23
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!

Verfasst: 22. März 2007 13:27
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."

Verfasst: 22. März 2007 13:32
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