qglwidget leerer screen beim wechseln des Focus

Alles rund um die Programmierung mit Qt
Antworten
darrell
Beiträge: 3
Registriert: 20. Oktober 2010 14:30

qglwidget leerer screen beim wechseln des Focus

Beitrag von darrell »

Moin,

Ich habe seit längerem ein Problem in meiner Qt Anwenung.
Leider kommt es nur auf bestimmten Windows Xp Rechnern vor.
Wenn die Anwendung unter linux oder machen Windows Rechnern ihren Focus verliert, bleiben der aktuell gerenderten Daten im Screen, was auch unbedingt so sein soll. Auf den anderen Xp Maschinen jedoch wird der Screen beim verlieren des Focus geleert.
Das hat den bösen Nebeneffekt, dass die erste gerenderte Scene nicht sichbar ist, bzw sofort wieder verschwindet.
Ich würder gerne wissen warum das passiert und warum nur bei manchen Rechnern.

Code: Alles auswählen

void Analyzer :: initializeGL()
{
	// antialising
	glEnable(GL_LINE_SMOOTH);
	glEnable(GL_POINT_SMOOTH);
	glEnable(GL_POLYGON_SMOOTH);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
	glShadeModel(GL_SMOOTH);
	glDrawBuffer(GL_BACK);

	glClear(GL_COLOR_BUFFER_BIT);
	draw_grid();
	draw_borders();
	swapBuffers();
}


void Analyzer :: resizeGL(int w, int h)
{
	glViewport(0, 0, (GLint)w, (GLint)h );
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0f, X_SIZE+1.0f, 0.0f, Y_SIZE);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glClear(GL_COLOR_BUFFER_BIT);
	draw_grid();
	draw_borders();
	swapBuffers();
}

void Analyzer :: render_str(GLfloat x, GLfloat y, const char *str)
{
	makeCurrent();
	glColor3f(FONT_COLOR);
	glRasterPos2f(x, y);
	glutBitmapString(GLUT_BITMAP_HELVETICA_12, (const unsigned char *)str);
}
N¤X
Beiträge: 77
Registriert: 21. September 2009 12:24

Beitrag von N¤X »

...
Wie sieht denn deine paintGL() aus?
Rendercode gehört entweder da rein, oder wird von da aus aufgerufen. Im Resize- oder gar Init-Event hat Rendercode jedenfalls nix zu suchen, lediglich am ende von resizeGL kannst du updateGL aufrufen, aber auch nicht direkt den Rendercode!

Qt nimmt dir da ein bisschen was ab, unter anderem auch das Buffer swapen und so nen Kram. Du packst also immer jegliches Gerendere in die paintGL und wenn du was rendern willst rufst du die updateGL auf. Fertsch.

Ach ja, und für Antialiasing gibts z.B. GL_ARB_multisample. Die ganzen ...-smooth Funktionen sind zwar praktisch für Punkte und auch für Linien manchmal noch ganz nett, für Polygone ist das aber nicht gerade die beste Wahl, sobald man mehrere davon zu komplexeren Körpern verbinden will. ;)
mfg N¤X
darrell
Beiträge: 3
Registriert: 20. Oktober 2010 14:30

Beitrag von darrell »

Ja, das ist klar soweit.
Auf den meisten Rechnern funktioniert das auch ;)

Der komplette zu rendernde Code wird in externen Funktionen aufgerufen.
Alles wird in den GL_BACK Buffer gezeichnet ...wenn eine Scene feritig ist,
wird swapBuffers() aufgerufen. paintGL() ist leer.

...Du bringst mich aber gerade auf eine Idee. Ich werde versuchen autoSwapBuffers auf false zu setzen, denn im qt qgl.cpp code wird nach jedem aufruf von paintGL ein swapBuffers ausgeführt.
Allerdings erklärt das nicht, warum es bei manchen Rechnern geht und bei manchen nicht.

Danke ;)
darrell
Beiträge: 3
Registriert: 20. Oktober 2010 14:30

Beitrag von darrell »

EDIT:
Die Anwenung ist ein Spectrum Analysator, die über ethernet an einen fft Prozessor angeschlossen ist. Alles was ich rendere sind also nur Linien und Bitmaps für die Schrift....daher langt das "billige" Antialising.
Antworten