Seite 1 von 1

QGLWidget zeichnet nichts

Verfasst: 5. Mai 2008 17:18
von FreakyBKA
Hallo,
also ich habe ein Problem mit dem QGLWidget, ich habe wie in der Doku angegeben die paintGL, resizeGL und initializeGL überladen und dort quasi reingeschrieben was ich sonst bei glutDisplayFunc, glutReshapeFunc mache und sonstige Initialisierungen in die initializeGL.
ich habe also ein Klasse

Code: Alles auswählen

class GLWidget : public class QGLWidget
{
//...
}
mit den als protected überladenen Funktionen.
in meinem Hauptfenster habe ich dann ein Objekt der Klasse GLWidget

Code: Alles auswählen

class frm_main : public QMainWindow, protected Ui_frm_main
{
	Q_OBJECT
	public:
		GLWidget *glWidget;
//...
}
in dieser Klasse erzeuge ich dann mittels

Code: Alles auswählen

//...
glWidget = new GLWidget(this);
//...
eine neues Objekt der Klasse, die mir meine OpenGL-Grafiken zeigen soll, jedoch tut sie das nicht. Muss man da noch zusätzlich irgendwas einstellen dass das auch gezeichnet wird?
Mausinteraktionen mit dem glWidget funktionieren auch nicht obwohl ich sie definiert habe, ich wollte mir nur die Mausposition ausgeben lassen aber es kommt nie zu dem MousePressEvent o.ä.
Achso ein weiteres Problem nebenbei ist noch, dass obwohl ich bei dem Hauptfenster MouseTracking auf true gestellt habe, wird das MouseMoveEvent nur beim Klicken ausgelöst, das versteh ich auch nicht genaz warum das so ist, sollte ja eigentlich dann immer ausgelöst werden wenn die Maus bewegt wird.
Besten Dank schon mal im Voraus

Verfasst: 5. Mai 2008 19:13
von Christian81
Zu wenig code - wo zeigst Du das Widget an usw.?
Beispiele schonmal angeschaut?

Verfasst: 5. Mai 2008 19:25
von Volker
Bin mir nicht sicher, aber ich glaube das Maustracking bezieht sich immer nur auf das Fenster auf dem es gesetzt ist und nicht auch auf die Widgets die darin enthalten sind. D.h. Maustracking nicht für das MainWidget setzen sondern für das QGLWidget.
An sonsten kann's für ein leeren OpenGL Viewport viele Gründe haben. Wie Christian schon gesagt hat, aus dem angegebenen Code herauszufinden warum's nicht geht, ist schwierig.

Verfasst: 5. Mai 2008 19:27
von FreakyBKA
also das beispiel aus der doc von Qt zu QGLWidget hilft mir da nicht, weil da diesbzgl nichts hilfreiches drinsteht.
das widget wird im hauptfenster angezeigt

Code: Alles auswählen

	glWidget = new GLWidget(this);
	glWidget->setGeometry(QRect(0, 20, 844, 570));
	glWidget->setMouseTracking(true);
	glWidget->setEnabled(true);
	glWidget->show();
und das zeichnen läuft über einen timer der regelmäßig updateGL aufruft.

Code: Alles auswählen

	QObject::connect(timer, SIGNAL(timeout()), glWidget, SLOT(updateGL()));
als beispiel zum zeichnen hab ich zB

Code: Alles auswählen

void paintGL()
{
	glBegin(GL_LINE_STRIP);
		glColor3f(1,0,0);
		glVertex3f(0,0,1);
		glVertex3f(1,0,1);
		glVertex3f(1,1,1);
		glVertex3f(0,1,1);
		glVertex3f(0,0,1);
	glEnd();
}

Verfasst: 5. Mai 2008 19:34
von Christian81
QGlWiget ist immernoch ein QWidget und man kann auch hier nur in paintEvent() zeichnen.

Verfasst: 5. Mai 2008 19:39
von FreakyBKA
was ist dann der Sinn von paintGL? oder muss ich dann einfach im paintEvent updateGL auslösen? und wie kann ich in meinem timer dann das paintEvent auslösen?
ich hab übrigens auch für die GLWidget das mousetracking angeschaltet, geht aber trotzdem nur für das hauptfenster und auch nur bei mausklicks.

Verfasst: 5. Mai 2008 19:43
von Christian81
ok - mein Fehler. updateGL() ist korrekt (entspricht paintEvent() von QWdiget). Nur das Du es von Hand aufrufst nicht.

Verfasst: 5. Mai 2008 19:58
von FreakyBKA
dafür ist doch das updateGL da, das man es auch von Hand bzw wenn es halt von Nöten ist aufrufen kann.

Verfasst: 5. Mai 2008 20:04
von Christian81
Zeig mal den kompletten Code...

Verfasst: 5. Mai 2008 20:16
von FreakyBKA
so habs jetzt hinbekommen, war natürlich ein fehler meinerseits. hab das QGLWidget zu früh in die klasse des hauptfensters mit eingebunden, sodass da wahrscheinlich noch ein paar initialisierungen nicht abgearbeitet waren.
danke trotzdem.