QT: SplashScreen mit Netwerzkzugriff



  • Hi,

    ich möchte gerne Folgendes erreichen:

    Vor dem eigentlichen Programm soll eine Abfrage ans Internet gemacht werden (mit QNetworkAcessManager). Je nachdem, ob das klappt oder nicht, werden ein paar Daten gemerkt, das ist nicht wild. Dann wird eine Prüfung vollzogen, ob es sich um eine Trial- oder Vollversion handelt. Falls Vollversion, soll sofort das Hauptfenster angezeigt werden. Bei einer Trialversion kommt ein Zwischenfenster, das anzeigt, wie viele Tage man noch hat, in dem man auch die Seriennummer eingeben kann und womit man durch Ok-Klick schließlich zum Hauptprogramm kommt.

    Das funktioniert. Aber ich bin unsicher, ob ich das speicherkonform gelöst habe...

    Das meint: Ich rufe in der main.cpp ein QObject-Derivat auf (kein Dialog, nur eine Steuerklasse, die auf Events reagiert und eben diesen Netzwerkzugriff macht). Die zeigt einen Splashscreen an, der während dem Netzwerkzugriff durchgeführt wird. Die Klasse enthält zwei auto_ptr auf den TrialVersion-Dialog und auf mein eigentliches Hauptprogramm. Denn ich will nur das initialisieren, was ich auch nutze.

    Und dann wird eben im SLOT onNetworkReply alles erledigt. Ergebnis wird geprüft usw. und dann rufe ich eben entweder mit exec() noch den TrialDialog auf und nach dessen Ergebnis dann evtl. das Hauptprogramm oder eben direkt das Hauptprogramm mit QMainWindow::show(), was ja nicht blockiert...

    Es funktioniert, aber ich bin unsicher, was die Speicherverwaltung angeht, denn die Destruktoren vom Hauptprogramm und vom Dialog werden ja erst aufgerufen, wenn auch dieses QObject-Derivat stirbt. Aber jetzt hatte ich einmal den Fehler, dass er im destructor vom auto_ptr einen Speicherzugriffsfehler hat. Einmal und nie wieder, trotzdem glaube ich, dass ich irgendwas hier falsch mache.

    Muss man beim Aufräumen in QT irgendwas beachten?

    Edit:
    Ok, konkret ist das Problem, dass auto_ptr::~auto_ptr() dumpt, weil er beim delete einen Speicherzugriffsfehler erhält. Ist auto_ptr mit QT nicht kompatibel? Warum nicht?



  • Dir ist schon klar, dass ein QObject normal ein parent hat und gelöscht wird, wenn das parent gelöscht wird? Würde mich überraschen, wenn du es nicht wissen würdest, weil du anscheinend schon einiges mit Qt gemacht hast (die ganze anderen Fragen von dir) und das so ziemlich das grundlegendste Konzept von Qt überhaupt ist.
    Bei Qt solltest du kein auto_ptr brauchen. Natürlich kann man auch bei Qt Klassen ab und zu den parent weglassen und sie über smart pointer verwalten, aber dafür solltest du schon einen guten Grund haben.



  • Ja, das ist mir schon bewusst und mir geht es auch um den Fall, dass eine Klasse keinen Parent hat.

    Ich habe das jetzt alles umgebaut, weil es einfach hingeklatscht war. Aber in int main() möchte ich mein QMainWindow gerne dynamisch erstellen. Darum hatte ich da einen auto_ptr hingepackt. Nur eben das führt zu einem Speicherfehler, den ich nicht verstehe.

    Oder kann QApplication auch als Parent dienen? Dann wäre das natürlich Unsinn.

    Edit: Doch selbst dann wüsste ich gerne, wieso auto_ptr dumpt? Da hab ich ein doch ein parentloses Widget reingesteckt.



  • Eisflamme schrieb:

    Edit: Doch selbst dann wüsste ich gerne, wieso auto_ptr dumpt? Da hab ich ein doch ein parentloses Widget reingesteckt.

    Es dumpt, weil du einen Fehler gemacht hast, aber ohne Code kann man schlecht sagen, wo 😉
    Sicher, dass die keinen parent haben und nicht mehr benötigt werden?

    Edit: QApplication kann natürlich auch als QObject dienen. Und du kannst dein MainWindow auch dynamisch erstellen und ihm einen parent reingeben, dann wird es auch automatisch gelöscht.



  • Aber mein Hauptfenster ist ja ein QMainWindow und dessen ctor will ausdrücklich ein Widget und kein Object als Parent, also kann ich das wohl nicht so nutzen, wie ich gerne wollte?



  • Naja, du kannst immer noch setParent aufrufen und ein QObject reingeben.



  • Nö, will auch ein QObject... hätte mich jetzt auch sehr gewundert, wenn das plötzlich geklappt hätte ^^



  • Ja, du hast doch ein QObject. QApplication ist ein QObject.



  • QWidget... vertippt... sorry.

    Wie auch immer, ich hab beim Erstellen von QMainWindow keine übergeordnete Instanz. Das Standardmain von QT legt da ja auch einfach immer QMainWindow auf dem Stack an. Ist eben kein verzögertes Initialisieren. Habe nun auto_ptr genutzt und der funktioniert zurzeit... Warum auch immer.


Anmelden zum Antworten