Ladebalken in QT4 durchlaufen lassen



  • Hallo erstmal 😉

    Also ich habe mal wieder eine Frage zu QT4. Ich kenne mich mit QT4 noch nicht so gut aus, brauche aber für mein in C++ geschriebenes Programm zur Abwechslung auch mal eine grafische Oberfläche... Ansonsten hätte ich das ganze schon längst über die Konsole realisiert 😉

    Also mein Problem ist folgendes: Ich habe zwei Dialoge, über den Knopfdruck in dem einen Dialog wird der andere kleinere Dialog aufgerufen, der einen Ladebalken beinhaltet. Dieser Ladebalken soll (vorerst nur zum Testen ob es funktioniert) jede zehntel Sekunde einen Schritt nach vorne geschoben werden. Mein Code dafür sieht so aus:

    maindialog.cpp:

    #include <QtGui> 
    #include <QDialog>
    #include <QThread>
    #include "main.h"
    #include "readout.h"
    
    maindialog::maindialog(QDialog *parent)
    {
    	setupUi(this);
        connect(pushButton, SIGNAL(clicked()), qApp, SLOT(quit()));
        connect(startCheck, SIGNAL(clicked()), this, SLOT(showdialog()));
    }
    
    readout::readout(QDialog *parent)
    {
    	setupUi(this);
        connect(pushButton, SIGNAL(clicked()), this, SLOT(close()));
    }
    
    void readout::increaseline()
    {
        int steps = 50;
        int writeout = 0;
        int steplength = 100/steps;
        for (int i = 0; i < steps; i++)
        {
            writeout = i*steplength;
            QThread::msleep(100);
            progressBar->setValue(writeout);
        }
    }
    
    void maindialog::showdialog()
    {
    	readout *dialog2 = new readout;
    	dialog2->show();
    	dialog2->increaseline();
    }
    

    Leider funktioniert das ganze überhaupt nicht. Vorher, als ich anstelle von QThread noch die sleep-Funktion verwendet habe, hat er immer erst den ganzen Ladebalken durchlaufen lassen, nur ohne Dialogfenster, und dann kam erst das Fenster mit dem Ladebalken. Das heißt das ganze lief nicht parallel ab. Nun, mit QThread bekomme ich angezeigt, dass nur QThread den msleep aufrufen darf, da der ja static protected ist. Na bravo. Jetzt fehlen mir ganz ehrlich die Ideen und ich habe auch keine Lust wegen dieser einen Anwendung ewig die ganzen QT-Turoails durchzuwälzen bis ich irgendwann dann auch mal in der Lage bin das ganze richtig hinzubekommen... Der Rest funktioniert ja auch schon!
    Ich würde mich also echt riesig freuen, wenn ihr mir da bei dem Problem behilflich sein könntet oder mir ein zwei Seiten zu lesen gebt (bitte nicht irgendwelche Grundlagen seiten, da lese ich nämlich wieder mehrere Wochen dran bis ich mein Problem lösen kann), auf denen direkt eine Lösung für mein Problem zu finden ist. Vielen Dank also schonmal und ganz liebe Grüße,

    Jonathan



  • Es gibt bestimmt ein gutes Forum zu QT. Das hat mit C++ ja direkt nicht viel zu tun.



  • Naja indirekt denk ich ja schon oder lässt sich das nicht mit c++ lösen?



  • Nimm einen QTimer, und setze in der Timeoutfunktion den Ladebalken:

    ...
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(incProgress()));
    timer->start(100);
    ...
    

    und

    void incProgress()
    {
    // writeout = i*steplength; irgendwie den Fortschritt berechnen
       progressBar->setValue(writeout);
    }
    

    dann läuft das auf alle Fälle parallel.



  • Vielen Dank, genau danach habe ich gesucht 🙂
    Echt super, wie schnell einem hier im Forum immer geholfen wird, muss ich jetzt doch echt mal sagen 🙂



  • Den Timer brauche ich ja jetzt erstmal um zu gucken, ob mein Vorhaben generell so funktioniert... Später soll der Fortschritt ja durch die einzelnen Operationen automatisch verzögert werden...



  • Aber das widerspricht sich doch nicht, oder steh ich jetzt auf dem Schlauch? 😕
    Du kannst doch in der Timeoutfunktion schauen, wie weit du bist und den Fortschrittsbalken dementsprechend setzen. Das heißt doch nicht, dass bei Auruf der Timerfunktion der Fortschrittsbalken jedesmal ein Stück weiter muss.



  • schon klar 😉

    Aber ich will jetzt halt einfach erstmal einen hübsch durchlaufenden Ladebalken haben. Später, wenn der Ladebalken"dummy" Code dazubekommt, also wirklich einen Fortschritt signalisiert, dann brauche ich die Timer-Funktion ja eh nichtmehr weil dann einfach nach jedem fertigen Schtritt meines Codes der Ladebalken etwas weitergesetzt wird... Aber zur Zeit würde da der Ladebalken im bruchteil einer Sekunde fertig durchlaufen, weil ich ja noch keinen Code hätte, der das weiterlaufen etwas aufhält...



  • ok, nächstes Problem 😉
    Ich bekomms nämlich schlichtweg nicht hin. Bis jetzt sieht mein betreffender Code so aus:

    timer::timer(QWidget *parent) : QWidget(parent)
    {
        QTimer *timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(readout::increaseline()));
        timer->start(100);
    }
    
    void readout::increaseline()
    {
        int steps = 50;
        int writeout = 0;
        int steplength = 100/steps;
        for (int i = 0; i <= steps; i++)
        {
            progressBar->setValue(writeout);
        }
    }
    

    Sieht irgendjemand, was ich jetzt falsch habe? (Mal abgesehen vom Inhalt der readout::inreaseline, bis dahin kommt der Compiler aber garnicht)

    timer.h:6: Fehler: invalid use of incomplete type »struct QWidget«
    

    timer.h:

    #ifndef timer_H
    #define timer_H
    
    class timer : public QWidget
    {
        Q_OBJECT
    public:
        timer(QWidget *parent = 0);
    };
    
    #endif
    


  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • du musst QWidget auch einbinden...


Anmelden zum Antworten