Seite 1 von 1

[solved] Dynamisch Objekte erstellen

Verfasst: 19. März 2012 10:52
von Schreiber
Hallo zusammen,

ich bin neu hier im Forum und auch relativ neu bei Qt.

Derzeit schreibe ich ein Plugin für ein bereits bestehendes Projekt. Das Orginalprojekt besitzt eine GUI basierend auf Qt und mein Plugin soll zusätzlich noch ein eigenes Fenster erhalten in dem Ergebnisse von Berechnungen angezeigt werden können. Dazu habe eine Klasse von QWidget abgeleitet, sämtliche Label und Button erstellt und angezeigt.
Soweit funktioniert das Ganze auch ausgezeichnet. Allerdings kann ich Qt Objekte nur im Konstruktor meiner Klasse erstellen. Versuche ich zur Laufzeit ein weiteres Objekt zu erstellen (z.B. Qlabel* testlabel = new QLabel()) beschwert sich das Programm (vollkommen zurecht), dass dies außerhalb des Mainthreads nicht möglich ist.
Meine Frage also: Ist es irgendwie möglich ohne Manipulation des Orginalprojekts Objekte zur Laufzeit zu erstellen?

Ich weiß es gibt bereits unzählige "nicht außerhalb von mainthread" Fragen und ich lese bereits eine Zeitlang mit, aber leider konnte mir das alles nicht helfen.

Vielen lieben Dank schonmal für alle Antworten :wink:

Re: Dynamisch Objekte erstellen

Verfasst: 19. März 2012 11:54
von franzf
Dass es im Konstruktor geht hat MMn. nichts mit dem Konstruktor an sich zu tun. Ich denke mal, dein Plugin wird im Hauptthread geladen, weshalb der Konstruktor auch im Hauptthread aufgerufen wird. Die einzelnen Aufgaben des Plugins werden dann aber in einem eigenen Thread gestartet, weshalb dort das Instantiieren nicht klappt.
Wenn ich damit nicht richtig liege erklär doch mal bitte kurz, wie du in nen neuen Thread kommst ;)

Re: Dynamisch Objekte erstellen

Verfasst: 19. März 2012 12:23
von Schreiber
Ja du hast recht. Wenn das Hauptprogramm startet wird das Plugin geladen und damit auch dessen Konstruktor aufgerufen.
Die Berechnungsfunktionen meines Plugins (und damit auch meine Ausgabe GUI) werden danach aus einem Thread des Hauptprogramms aufgerufen. Ebendieser stellt sicher, dass Berechnungen nur auf neuen Bildern ausgeführt werden. (Vielleicht sollte ich noch anmerken, dass es sich um Echtzeitbildbearbeitung handelt wenn ich schon von Bildern anfange ^^)

Ich hoffe das hilft als Erklärung.

Re: Dynamisch Objekte erstellen

Verfasst: 19. März 2012 12:55
von franzf
SIGNAL-SLOT über QueuedConnection sollte immer gehen. Dazu musst du halt die Methoden zur Erstellung von neuen Child-Widgets in eigene SLOTS auslagern. Das Objekt liegt ja im HauptThread, deshalb werden SLOTS auch dort ausgeführt, falls QueuedConnection oder AutoConnection.
Wenn dich der Umweg über connection + emit stört, gibts natürlich noch QMetaObject::invokeMethod. Damit hast du klare Funktionsaufrufe, statt die nebulöse Inderektion über emit.

Re: Dynamisch Objekte erstellen

Verfasst: 19. März 2012 14:14
von Schreiber
Ah, ausgezeichnet.
Ich hatte bereits Signale und Slots für Kleinigkeiten wie einen Progressbar genutzt, aber auf die Idee, dass diese ja auch Variablen zurückgeben können wäre ich alleine nicht gekommen.

Vielen vielen Dank :)