Seite 1 von 1

Tastaturabfrage - bei machen Tasten klappts...

Verfasst: 29. März 2007 18:51
von heinweb
Hallo zusammen!

Habe ein kleines Problem mit einem QT-Programm, welches ich gerade schreibe. Das Programm zeigt NURBS-Flächen in 3D an und basiert im wesentlichen auf dem Hello GL-Beispiel.
Ich habe einige zusätzliche Tasten definiert, z.B. die Taste "B" zum ein/ausblendern der BoundingBoxen der Flächen, das funktioniert auch.

Nun möchte ich gern die Tasten W,A,S,D dazu nutzen, einen Punkt im Raum zu bewegen, um damit eine Abstandsberechnung bezüglich der Fläche zu machen - der Code kompiliert auch, aber die verknüpften Funktionen werden nicht aufgerufen (per Debugger nachgeprüft). Ich bin mit meinem Latein am Ende - wer kann mir sagen warum die Taste "B" funktioniert, die "WASD"-Tasten jedoch nicht?

Code: Alles auswählen

wAct = new QAction(tr("&Vor"), this);
	wAct->setShortcut(tr("w"));
	connect(wAct, SIGNAL(triggered()), glWidget, SLOT(wMove()));

	aAct = new QAction(tr("&Links"), this);
	aAct->setShortcut(tr("a"));
	connect(aAct, SIGNAL(triggered()), glWidget, SLOT(aMove()));

	sAct = new QAction(tr("&Zurück"), this);
	sAct->setShortcut(tr("s"));
	connect(sAct, SIGNAL(triggered()), glWidget, SLOT(sMove()));

	dAct = new QAction(tr("&Rechts"), this);
	dAct->setShortcut(tr("d"));
	connect(dAct, SIGNAL(triggered()), glWidget, SLOT(dMove()));




	bbAct = new QAction(tr("&Toggle BoundingBox"), this);
	bbAct->setShortcut(tr("b"));
	connect(bbAct, SIGNAL(triggered()), glWidget, SLOT(toggleBB()));
...
        displayMenu->addAction(bbAct);
	displayMenu->addSeparator();
	displayMenu->addAction(wAct);
	displayMenu->addAction(aAct);
	displayMenu->addAction(sAct);
	displayMenu->addAction(dAct);
Die Funktionen wMove(),aMove(),etc. sind im glWidget selbstverständlich definiert, und sie funktionieren auch, wenn ich ich sie bspw. aus der toggleBB()-Methode aufrufe.

Verfasst: 29. März 2007 19:05
von May-C
Hab zwar nicht direkt eine Lösung...
Wird denn ein KeyEvent von dem Widget empfangen?
Kannst du ja mal testen mit:

Code: Alles auswählen

void MyWidget::keyPressEvent(QKeyEvent *event)
{
	
	switch (event->key())
	{
		case Qt::Key_W:
			
			qDebug() << "w pressed";
			break;
		
		default:
			QWidget::keyPressEvent(event);
	}
}

Verfasst: 29. März 2007 19:33
von heinweb
Nein, da wird nix empfangen - auch nicht bei der B-Taste, die ja funktioniert.
Die QActions werden in der Klasse
Window, welche von QMainWindow erbt, erstellt und dann werden mit connect() die Aktionen in glWidget verbunden.

Leider klappt das eben nur bei manchen Funktionen, obwohl die betroffenen Funktionen von der Signatur her identisch sind, z.B:

Code: Alles auswählen

void GLWidget::aMove()        //Geht nicht
void GLWidget::toggleBB()       //Klappt einwandfrei
Die Funktionen sind auch nicht sonderlich kompliziert:

Code: Alles auswählen

void GLWidget::toggleBB()
{
	showBB=!showBB;
	object = makeObject();
	updateGL();
}

void GLWidget::aMove()
{
	this->globaltestpunkt.y+=0.1;
	object = makeObject();
	updateGL();
}

Verfasst: 29. März 2007 20:04
von heinweb
Ok, bin inzwichen selbst drauf gekommen - aus irgendeinem Grund wurde meine Header-Datei für das GLWidget nicht mehr "gemoct" - nachdem ich in Visual-Studio wieder einen benutzerdefinierten Buildschritt angelegt hatte, läuft nun alles wieder einwandfrei und so wie es sollte...
Trotzdem vielen Dank für die Hilfe!

Grüße,
Michael

PS: Argh, hab jetzt nen halben Tag mit so einem Blödsinn verplempert... ;-(