komplexe tastatur- und mouse-events

Alles rund um die Programmierung mit Qt
Antworten
heckenhugo
Beiträge: 3
Registriert: 26. Mai 2007 02:01

komplexe tastatur- und mouse-events

Beitrag 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
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag 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*
heckenhugo
Beiträge: 3
Registriert: 26. Mai 2007 02:01

Beitrag 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?
heckenhugo
Beiträge: 3
Registriert: 26. Mai 2007 02:01

Beitrag 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:
Antworten