Klassen/Objekte Organisation mit OpenGL

Alles rund um die Programmierung mit Qt
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Klassen/Objekte Organisation mit OpenGL

Beitrag von Illuminatus »

Hi
ich habe eine Oberflächenklasse die als Membervariablen ein von QGLWidget abgeleitete Klasse enthält und eine Liste von Objekten. Ich möchte nun, dass wenn diese Liste gefüllt ist, durch irgendeine Interaktion diese Objekte ausgelesen werden und von dem OpenGL Widget ausgelesen werden. Meine Frage ist nun, wenn ich die Bearbeitung des Objektes in die OpenGL Klasse stecke, dies bereits zu Beginn der Laufzeit (also wenn die Liste noch leer ist) geschieht, und wie ich erreichen kann, dass das OpenGL Fenster erst zu meiner Interaktion gerendert wird? (zu Beginn des Programms ist es das centralWidget meiner Oberfläche....
thx =)
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

Beitrag von VuuRWerK »

Gehe ich recht in der Annahme Du willst eine Aktion starten wenn Du das erstemal etwas in die Liste einfügst? Wenn ja dann sollte Dir das Signal & Slot Framework helfen.

Gut Schuß
VuuRWerK ;)
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

hi das signal slot is nich das problem! mein problem is die konstruktion mit dem QGL Widget! ich habe eine von einer GLWIdget abgeleitete klasse! und mir gehts darum! beim konsturktor der oberfläche hab ich eben die *anzeige=obengldrawer(this); und diese oberfläche besteht noch aus steuerelementen! und ich möchte nachdem ich eine interaktion "fertig habe", dass das opengl fenster neu gezeichnet wird! also der code in der draw() die abhängt von der oberflächen-internen-liste neu berechnet und dargestellt wird!


lg
illu
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

Beitrag von VuuRWerK »

Entweder drückst Du Dich falsch aus oder aber ich verstehe Dein problem nicht aber so wie Du es hier beschreibst klingt es immernoch nach dem Signal & Slot.

Gut Schuß
VuuRWerK ;)
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

hi also hab im assi nochma nachgeschaut, und ich hab mich wirklich doof ausgedrückt ! mir gehts darum, ich will den slot updateGL() aufrufen meines widgets opengldrawer!
ich weis dass ich signal und slots verknüpfe mit QObject::connect();
wie mach ich das nun?

ich habe eine größere methode die schon als slot ausgeführt wird und ich möchte dass am ende der methode (also wenn die liste gefüllt wurde) der slot aufgerufen wird?

muss ichu nun ein signal definieren dass als methode in meiner methode ausgeführt wird, und welches ich mit dem in QGLWidget definierten slot verbinde?
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

Beitrag von VuuRWerK »

Genau, erstelle ein Signal welches Du am Ende Deiner Arbeiten emittest und verbindest dieses Signal mit dem QGLWidget#updateGL().

Gut Schuß
VuuRWerK ;)
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

hi also ich glaub ich habs zu umständlich formuliert^^
mein problem is folgendes:

ich habe eine hauptklasse, in der die meiste interaktion stattfindet! sie ist von QMainWIndow abgeleitet und stellt somit die GUI dar. Sie besitzt desweiteren ein privates Objekt vom Typ QList<tupel>.

Als CentralWidget hat sie die klasse opengldrawer die von QGLWidget abgeleitet ist. Ich habe nun per SIgnalSlot es so eingerichtet ist, dass wenn durch meine Interaktion diese Liste gefüllt wurde der Slot updateGL() dieser Klasse aufgerufen wird. Ich möchte dann in der draw() Funktion dass diese Punkte aus meiner in der oben genannten Klasse definierten Liste ausgelesen werden. Ich habe versucht per

Code: Alles auswählen

extern QList<tupel> objekte
in der header der QGLWidget Klasse bkannt zu machen, das schlägt aber beim Linken fehl.


ich hab null plan wie das zu lösen sein könnte.. :(
Zuletzt geändert von Illuminatus am 26. Februar 2009 12:08, insgesamt 1-mal geändert.
CLRS530
Beiträge: 155
Registriert: 8. Oktober 2007 18:00

Beitrag von CLRS530 »

Ich habe jetzt nicht alles gelesen, aber du kannst das connect doch in der Klasse erstellen, die beide kennt. Oder spätestens die main, wenn die beide kennt.
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

CLRS530 hat geschrieben:Ich habe jetzt nicht alles gelesen, aber du kannst das connect doch in der Klasse erstellen, die beide kennt. Oder spätestens die main, wenn die beide kennt.
hi das is nciht das problem, es geht darum dass ich zugriff auf eine liste brauhce die wo anders definiert ist
CLRS530
Beiträge: 155
Registriert: 8. Oktober 2007 18:00

Beitrag von CLRS530 »

Dann musst du deine Struktur überdenken. Entweder packst du die Liste woanders hin und fügst z.B. einzelne Elemente mit add als funktion der Klasse hinzu oder aber, wenn das Signal von MainWindow gesetzt wird, kannst du die Liste doch einfach mit übergeben.
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

CLRS530 hat geschrieben:Dann musst du deine Struktur überdenken. Entweder packst du die Liste woanders hin und fügst z.B. einzelne Elemente mit add als funktion der Klasse hinzu oder aber, wenn das Signal von MainWindow gesetzt wird, kannst du die Liste doch einfach mit übergeben.
Wie übergeb ich die Liste mit??? dazu muss der SLOT diese doch auch entgegennehmen oder? und der updateGL() erwartet doch keine parameter?
CLRS530
Beiträge: 155
Registriert: 8. Oktober 2007 18:00

Beitrag von CLRS530 »

Du kannst bei Signals und Slots auch Parameter mit übergeben
void signal(const QList<Tupel> &tupel);
void slot(const QList<Tupel> &tupel);
Also beide male als Parameter, nichts mit Funktionsrückgabe. Das Signal dann ganz einfach mit emit signal(tupel); in die weite Programmwelt pusten ;)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

CLRS530 hat geschrieben:wenn das Signal von MainWindow gesetzt wird, kannst du die Liste doch einfach mit übergeben.
Bei langen Listen ist das sicherlich kein so gutes Vorgehen, da die Parameter des SIGNALS komplett kopiert werden (Auch wenn die SIGNAL-Parameter mit ner Referenz definiert sind, AFAIK). Mit großen Objekte kostet das Zeit und Speicher.

Prinzipiell geht sowas mit extern schon. Aber so weit ich weiß ist die Liste ein Member einer anderen Klasse. Da ist das mit extern nicht lösen.

Warum gibst du nicht das Objekt, welches die tupel-Liste als Member hat, deiner Klasse als Member, die dann auf die Elemente zugreifen will, als Pointer/Referenz? Damit kannst du jederzeit auf die Daten zugreifen, ohne kopieren zu müssen.

Code: Alles auswählen

class opengldrawer : public QGLWidget
{
  Q_OBJECT
public:
  opengldrawer(dbvis* db);

protected:
  dbvis* m_dbvis;
};
(Ich glaube die Klasse hies doch dbvis, oder?)
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

das heißt ich müsste dann nochmal einen extra slot der ogl klasse hinzufügen, der wiederrum dann updateGL() aufruft oder wie?
CLRS530
Beiträge: 155
Registriert: 8. Oktober 2007 18:00

Beitrag von CLRS530 »

Ja genau. Aber was franzf hier geschrieben hat war mir neu. Da hat er dann die bessere Idee auf Lager ;)
Dann muss ich dann auch bei meinen Projekten das ein oder andere nochmal überdenken und vielleicht das Signal Slot Konzept genau studieren 8)
Antworten