Qt: QTabWidget Größe ändern und Tab-Inhalt aktualisieren



  • Ok,

    ich denke es ist gelöst 😃

    Ich nutze das currentChanged()-Signal des TabWidgets und leite es durch einen eigenen Slot. in dem Slot wird dann ein Timer-SingleShot ausgelöst, der nach 100ms ein weiteres Signal an einen zweiten Slot sendet. In dem zweiten Slot wird dann die entsprechende TabElement-funktion zur sichtbarkeit aufgerufen.
    Ist nicht schön aber funktioniert.

    Den Timer muss ich nutzen, damit erst der entsprechende Tab gezeigt wird. Vorher lässt sich die Sichtbarkeit nicht ändern...

    Das ListenElement sieht nur noch nicht schön aus, das nutzt die Höhe von 2 ListenElementen, aber das bekomm ich auch noch hin 😉



  • Es gibt noch die Möglichkeit, den Slot über eine Queued Connection zu verbinden, das sollte eigentlich auch funktionieren (ohne den Timer).
    Du solltest dich denke ich etwas besser mit dem Debugger vertraut machen. So bald man sich einigermaßen an Qt gewöhnt hat und versteht, wie das grundsätzlich funktioniert, kann man bei Problemen einfach reindebuggen und schauen was passiert oder nicht passiert.



  • Ich arbeite fast ausschließlich mit dem Debugger, der Rest ist größtenteils Hirn 😉
    Ohne Debugger weiß man ja nicht, wo ein Fehler herkommt. Ernsthaft, programmieren ohne zu debuggen ist doch bei allem, was nur etwas größer als "Hello World" ist, fast unmöglich 😃

    Ich bin noch neu in Qt, ist meine erste GUI damit und seit laaanger Zeit überhaupt wieder meine erste GUI.
    Ich bau die GUI ja um Qt zu lernen 🙂

    Bei mir fehlt einfach noch das Verständnis, das Wissen und die Gewöhnung.

    BTW, kannst du mir erklären, warum die Höhe eines ListenElements beim "zeichnen" geändert wird, obwohl ich die Höhe im Konstruktor mit "setFixedHight()" festgelegt habe (ernst gemeinte Frage, keine Kritik 🙂 )?

    Sowas wie den Hinweis auf die Queued Connection mag ich sehr gerne, ich wußte bis jetzt nicht, dass es sowas gibt und werde gleich mal danach googlen 🙂

    Viele Grüße
    Cherup



  • Cherup schrieb:

    BTW, kannst du mir erklären, warum die Höhe eines ListenElements beim "zeichnen" geändert wird, obwohl ich die Höhe im Konstruktor mit "setFixedHight()" festgelegt habe (ernst gemeinte Frage, keine Kritik 🙂 )?

    So spontan nicht. Aber vielleicht ist das was du siehst, auch nicht die Größe von dem Widget. Oder es ist das falsche Widget. Auf jeden Fall sollte Fixed Height schon ausgewertet werden.
    Wir haben uns so ein Debug Widget gebaut, das im laufenden Programm angezeigt werden kann. Mit dem kann man dann Widgets selektieren, sich den Widget Baum anschauen, Widget Eigenschaften usw. Ist recht praktisch zum Untersuchen, was man da überhaupt hat (kann schon mal passieren, dass etwas von jemandem geschrieben wurde, der seit fünf Jahren nicht mehr da ist), und in was für Containern das drinhängt und ob da irgendwelche komischen Werte gesetzt sind.



  • Ja, so ein Debug-Widget kann bei sowas sehr praktisch sein.
    In diesem Fall stammt alles von mir.

    Du hast Recht, die Höhe des Widgets ist korrekt, es wird nur in die Mitte von 2 Widgets gesetzt (eines davon nicht sichtbar). Das bekomm ich auch noch irgenwie hin...



  • Ooookay,

    und ich habe wieder ein Problem 😃

    Aus Erfahrung klug 😃 :

    Kurzform:
    Ich habe eine ScrollArea mit eine Liste von Qlabel -> Funktioniert.
    Die Liste der Label soll geändert werden -> Funktioniert nicht.

    Langform:
    Ich habe einen neuen Tab gebaut, in dem eine Liste von QLabels, getrennt von QFrame-Linien angezeit werden soll. Funktioniert grundsätzlich.
    Jetzt soll aber eine neue Liste von QLabels angezeigt werden, die ScrollArea bleibt aber leer. Die Listen sind unterschiedlich lang und werden erst zur Laufzeit gebaut, daher arbeite ich nicht mit setText().

    Die Label sind die richtigen, das habe ich schon überprüft.

    Hier der Code der "ChangeList"-Funktion:

    //Klasse:
    class TabElementLists : public QWidget{
    
        Q_OBJECT
    
    public:
        (...)
    
    private:
        QWidget* scaWidget;           //Widget für die ScrollArea
        QScrollArea *scaScrollArea;
        QVBoxLayout* vblListLayout;   //Layout für die Label und Trennlinien
        QVBoxLayout* vblWindowLayout; //Layout des Tabs
    
        map<int,map<int, QFrame*> > SeperatorLine;  //Speichert die Trennlinien
        map<int,map<int, QLabel*> > PlanetLabels;   //Speichert die Labels
    
        int myActualList;
    
        (...)
    };
    
    //ChangeList-Funktion
    void TabElementLists::ChangeList(int newList){
        //Aktuelle Widgets aus dem ListLayout entfernen
        for(auto it=LabelLists[myActualList].begin(); it!=LabelLists[myActualList].end(); ++it){
            vblListLayout->removeWidget(it->second);
            vblListLayout->removeWidget(SeperatorLine[myActualList][it->first]);
            //Die Label und Trennlinien sollen ja später wieder benutzt werden können
            it->second->setParent(NULL);
            SeperatorLine[myActualList][it->first]->setParent(NULL);
        }
    
        //neues Layout
        delete vblListLayout;
        vblListLayout = new QVBoxLayout;
    
        //Neue Label und Trennlinien in das neue Layout einfügen
        for(auto it=LabelLists[newList].begin(); it!=LabelLists[newList].end(); ++it){
            vblListLayout->addWidget(it->second);
            vblListLayout->addWidget(SeperatorLine[newList][it->first]);
        }
    
        //In dem Widget, das der ScrollArea gehört, das neue Layout setzen
        scaWidget->setLayout(vblListLayout);
    
        //Alles neu zeichnen
        scaWidget->repaint();
        scaScrollArea->repaint();
        this->repaint();
    }
    

    Habe ich irgendwas übersehen?
    Wie ich ja bereits bewiesen habe bin ich noch recht unwissend 😃

    Viele Grüße
    Cherup



  • Keine Ahnung, was LabelLists[newList], sieht man ja nicht. Ansonsten, reindebuggen 😉 Mir fällt grad nichts gravierend falsches auf.
    Die repaint Aufrufe brauchst sicher nicht.



  • Hab schon reindebugged, die Label stimmen auch, habs mit nem vector getestet, in den jeder neue labeltext gepusht wird. Es wird ja kein Fehler geworfen, der Mist wird nur nicht angezeigt 😞
    Naja, wenigstens ist es grundsätzlich korrekt. Langsam fange ich an, das QTabWidget zu hassen 😃

    Edit:
    Ich hab ne Lösung dafür gefunden, ich habe bei der Scrollarea das widgetSizeable auf true gesetzt. nur die optik gefällt mir noch nicht, aber immerhin seh ichs jetzt 😃



  • Du hast geschrieben, aus irgendeinem abstrusen Grund arbeitest du nicht mit setText, vielleicht sind die Labels einfach leer und werden nicht gezeichnet?



  • die Label sind korrekt.
    Ich arbeite nicht mit setText, weil ich die Anzahl der Label erst zur Laufzeit kenne. In einer Liste können es nur 5 sein, in der nächsten dann vielleicht schon 25, es gibt keine Obergrenze. Und zur Laufzeit werden noch weitere Listen eingefügt 😃



  • Muss man dir alles aus der Nase ziehen? Was heißt denn korrekt, haben die einen Text? Und wie setzt du den, wen nicht mit setText?



  • ja, die haben einen Text, der Text wird im Konstruktor beim erstellen der Labels gesetzt. in meinem letzten (oder vorletzten) post habe ich schon geschrieben, dass ich den text getestet habe, in dem ich einen vector mit den labeltexten befüllt habe. diesen habe ich mir danach beim debuggen angeschaut 😉

    ich hab in dem vorletzten post auch mit einem edit geschrieben, dass ich eine Lösung gefunden habe 🙂 müssen wohl beide etwa zeitgleich was geschrieben haben



  • Ich lese selten Edits (außer natürlich, ich hatte den ganzen Beitrag noch nicht gelesen). Schreib neue Antworten.


Anmelden zum Antworten