Seite 1 von 1

komplexe tastatur- und mouse-events

Verfasst: 26. Mai 2007 02:15
von heckenhugo
hallo,
hab grad ma angefangen, n bissl mit qt rumzuprogrammiern. ich wollte eine recht grosse szene mit opengl darstellen. in dieser szene wollte ich mich dann mittels mouse und tastatur bewegen koennen - so wie im 3d-spiel. jedoch scheinen die events sich gegenseitig zu behindern:
- mehrere tasten gleichzeitig geht nur willkuerlich
- mouse und tastatur zusammen ruckelt (bei konstanter fps)

Code: Alles auswählen

void GLWidget::mouseMoveEvent(QMouseEvent *event)
{	
	QCursor c;
	
	
	if(_navScene)
	{
		c.setShape(Qt::BlankCursor);
		QPoint p=c.pos();
		yaw		+= 0.002f * ( p.x() - 500);
		pitch	-= 0.002f * ( p.y() - 500);

		if (pitch > 1.0f ) pitch = 1.0f;
		else if (pitch < -1.0f) pitch = -1.0f;
				
		_v3set( tempDir, float(cos(yaw)*cos(pitch)),
						 float(sin(pitch)),
						 float(sin(yaw)*cos(pitch)));
					
		_v3add( camPos, tempDir, camDir);
					
		_v3crs( tempDir, camUp, tempDirCrs);

		_v3scl( tempDir,	0.5f, tempDir);
		_v3scl( tempDirCrs, 0.5f, tempDirCrs);
				
		c.setPos(500,500);
		setCursor(c); 
		
		updateGL();
	}

}

void GLWidget::keyPressEvent(QKeyEvent *event)
{		
	switch(event->key())
	{

	case Qt::Key_D:
		if(_navScene)
		{
			_v3add(camPos, tempDirCrs, camPos);
			_v3add(camDir, tempDirCrs, camDir);
		}
		break;
	case Qt::Key_A:

		if(_navScene)
		{
			_v3sub(camPos, tempDirCrs, camPos);
			_v3sub(camDir, tempDirCrs, camDir);
		}
		break;
	case Qt::Key_S:
		if(_navScene)
		{
			_v3sub(camPos, tempDir, camPos);
			_v3sub(camDir, tempDir, camDir);
		}
		break;
	case Qt::Key_W:
		if(_navScene)
		{
			_v3add(camPos, tempDir, camPos);
			_v3add(camDir, tempDir, camDir);
		}
		break;
	} 
	updateGL();
}
gibt es da einen eleganteren weg?
thx

Verfasst: 27. Mai 2007 03:22
von Eltharion
Lies Dir in der Doku zu QWidget glaube bitte mal die Hinweise zu QEvent.ignore() und accept() durch. Die Aufrufe vermisse ich komplett. In einer meiner Anwendungen hatte ich die auch vergessen bzw. absichtlich nicht gemacht und musste dann feststellen, dass dadurch und obwohl keine anderen Seiteneffekte auftraten die CPU-Last auf recht hohem Niveau lag.

E*

Verfasst: 28. Mai 2007 11:31
von heckenhugo
thx, aber ich glaub, das bringt auch nix. das problem ist ja mehrere events gleichzeitig auszuwerten. aber man hat halt keinen eventqueue sondern nur einzelevents. vielleicht waere es eine moeglichkeit, qwidget::event() neu zu implementieren und dort alles abzufangen... oder faellt jmd noch was bessres ein?

Verfasst: 30. Mai 2007 11:18
von heckenhugo
so, habs selber hingekriegt. un zwar so:
glwidget hat noch keyreleaseevent gekriegt un n 256langes bool-array taste[]. im keypressevent bzw. keyreleaseevent werden dann nur noch schalter umgelegt un die eigentlich auswertung kommt im mainloop.

Code: Alles auswählen


void GLWidget::keyPressEvent(QKeyEvent *event)
{		
	if(_navScene)
		taste[event->key()] = true;
}

void GLWidget::keyReleaseEvent(QKeyEvent *event)
{		
	if(_navScene)
		taste[event->key()] = false;
}


void GLWidget::paintGL()
{
    
	if(taste[Qt::Key_D])
	{
			_v3add(camPos, ...
trotzdem hab ich irgendwie im qt-fenster nur die haelfte der fps, die ich mit der selben gl-anwendung in nem windows fenster hatte :cry: