Qt: Widgets updaten



  • Hast du mal versucht nur das eine Widget, was sich verändert, upzudaten und den Rest dem System zu überlassen?

    Ich würde einfach das Widget ändern. Dann update() aufrufen, so dass es neu gezeichnet werden muss. Dann sollte alles wieder vernünftig dargestellt sein.



  • sry dass ich erst jetzt antworte ...
    ich hab jetzt mal deine Änderungsvorschläge eingebaut, aber mein Problem bleibt leider ... ich hab mal ein paar Fotos gemacht, ich denk das ist am besten 🙂

    http://hometown.aol.com/franzkissig01/foto1.jpg
    hier ist alles so wie es sein soll, es wurde von außen ein Label eingefügt.

    http://hometown.aol.com/franzkissig01/foto2.jpg
    hier wird jetzt ein weiterer Widget eingefügt, nur der mittlere bleibt einfach stehen und, was schlecht zu sehen ist, hat einen abgeschnittenen oberen Rand.

    http://hometown.aol.com/franzkissig01/foto3.jpg
    hier ist wieder alles wie es sein soll

    http://hometown.aol.com/franzkissig01/foto4.jpg
    hier dasselbe Problem ... 😕

    vielen Dank im Voraus,
    Franz



  • okay ... also ich mach noch ein versuch. ich hab das Problem jetzt in ein eigenes Programm isoliert, sodass ich mal Code posten kann.

    testprog.cpp:

    #include <QApplication>
    #include <mainwindow.h>
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        MainWindow fenster;
        fenster.show();
        return app.exec();
    }
    

    mainwindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    class QPushButton;
    class QWidget;
    class QLabel;
    class QVBoxLayout;
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
        public:
            MainWindow();
    
        private slots:
            void Fbutton1();
            void Fbutton2();
    
        private:
            QPushButton *button1, *button2;
            QWidget *anzeige, *mainwg;
            QLabel *label;
            QVBoxLayout *anzeigelayout;
    };
    
    #endif
    

    mainwindow.cpp:

    #include <QtGui>
    #include "mainwindow.h"
    
    MainWindow::MainWindow()
    {
        button1 = new QPushButton("Aktion1");
        connect(button1,SIGNAL(clicked()),this,SLOT(Fbutton1()));
    
        button2 = new QPushButton("Aktion2");
        connect(button2,SIGNAL(clicked()),this,SLOT(Fbutton2()));
    
        anzeige = new QWidget();
        anzeigelayout = new QVBoxLayout;
        anzeige->setLayout(anzeigelayout);
    
        mainwg = new QWidget();
        QHBoxLayout *mainlayout = new QHBoxLayout();
        mainlayout->addWidget(button1);
        mainlayout->addWidget(button2);
        mainlayout->addWidget(anzeige);
        mainwg->setLayout(mainlayout);
        setCentralWidget(mainwg);
    }
    
    void MainWindow::Fbutton1()
    {
        QLayoutItem *child;
        while((child = anzeigelayout->takeAt(0)) != 0)
        {
            delete child;
        }
    
        for(int i=0;i<2;i++)
        {
            label = new QLabel("Testtext");
            anzeigelayout->addWidget(label);
        }
    }
    
    void MainWindow::Fbutton2()
    {
        QLayoutItem *child;
        while((child = anzeigelayout->takeAt(0)) != 0)
        {
            delete child;
        }
    
        for(int i=0;i<1;i++)
        {
            label = new QLabel("Testtext");
            anzeigelayout->addWidget(label);
        }
    }
    

    und hier wie es aussieht, wenn man auf den rechten Button drückt:
    http://hometown.aol.com/franzkissig01/new_foto1.jpg
    und hier beim linken:
    http://hometown.aol.com/franzkissig01/new_foto2.jpg

    Ich wäre euch für des Rätsels Lösung echt mega dankbar ... 👍
    Und dann hab ich wärend ich dieses kleine Programm geschrieben hab, mal probiert, einfach beim Klick auf den Button immer ein weiteres QLabel mit "Testtext" einfügen zu lassen. Merkwürdigerweise funktioniert dass ohne das Problem...

    Franz



  • Und was ist genau das Problem? Das kaputte T?

    Bei Qt 4.0.1 tritt das bei mir auch auf. Bei Qt 4.1 Beta nicht. Ich denke also, dass es an Qt liegt. Du solltest die neue Version versuchen.



  • naja, das Problem ist, dass diese Zeile mit dem kaputten T ja gar nicht auftauchen sollte ... sollten ja bloß 2 Zeilen sein!

    Okay, dann weiß ich also worans liegt und beiß mir nich weiter die Zähne dran aus 😉

    thx a lot
    Franz



  • Jetzt wird mir dein Problem klar. Das ist gar kein Qt Fehler.

    Du löscht nur die QLayoutItem Objekte. Die ganzen Widgets sind alle noch vorhanden und aktiv, aber aus dem Layout raus. Deshalb hängen die einfach nur noch rum.

    Du musst natürlich auch die Widgets löschen:

    delete child->widget();
    delete child;
    


  • Ich hab trotzdem mal ne neue Qt runtergeladen 😉
    und siehe da es ist ein bisschen anders ... jetzt werden einfach wie du sagst einfach sämtliche Elemente auf dem Bildschirm 'vergessen' ... gibts denn nich irgendne Möglichkeit den Bereich kurz nach dem Löschen des Layouts einmal zu malern? Ich hab schon mit anzeige->repaint(); rumprobiert, aber das tuts einfach nicht ...
    Mensch sowas kann doch nicht so schwer sein, das machen Programme doch öfter 😉

    aber wenn ich das Widget anzeige einfach lösche, muss ichs doch neu zu mainlayout hinzufügen, oder? Und wenns korrekt sein soll vorher noch entfernen?

    Franz



  • Du willst doch deine ganzen QLabels löschen? Das geht dann so wie ich es gesagt habe. Anzeige selbst wird dann nicht gelöscht oder das Layout darin. Nur die Widgets im Layout.

    Also zumindest ist das die Lösung für dein minimales Program. Erkläre noch mal genau, warum das keine Lösung für dein Gesamtproblem ist. Und zeig ein minimales Program, das den Fehler zeigt.



  • Bevor ich wieder stundenlang in die falsche Richtung progge *g*
    Liege ich dann mit der Taktik richtig, wenn ich mit mit
    QObject::children () const
    ne Liste zurückgeben lasse und dann jedes Element ähnlich wie bei den QLayoutItems-Objekten löschen lasse? Verschwinden dann die alten, verwaisten Schriftzüge?
    Franz



  • Also ehrlich? Ich hab bislang nur die hälfte verstanden.
    Ich würde das Problem "Löschen Widget" aber anders angehen und das funkt eigentlich auch immer.

    QPtrList<QLabel> list;
    for (int i=0 bis 3)
    {
    QLabel* label = new Qlabel(....
    list.append(label);
    }

    //if (!list.isEmpty())
    QLabel* l;
    for ( l = list.first(); l; l = list.next() )
    delete l;
    or
    delete list.current();
    or
    bool QPtrList::remove ()
    Removes the current list item.
    Returns TRUE if successful, i.e. if item is in the list; otherwise returns FALSE.
    The removed item is deleted if auto-deletion is enabled.

    Bei sowas würde ich immer mir Pointerlisten arbeiten, die können furchtbar nützlich sein.

    Gruss,
    Buggykite



  • Naja, das wär ne Lösung wenns nur um QLabels geht ... was ich bräuchte wär im Prinzip nen QTabWidget ohne die Tableiste ... das kann doch nich so schwer sein, wenn ich ein paar QLabels hab, und ich auswählen will, welches 'oben' liegt!



  • nalpak01 schrieb:

    Naja, das wär ne Lösung wenns nur um QLabels geht ... was ich bräuchte wär im Prinzip nen QTabWidget ohne die Tableiste ... das kann doch nich so schwer sein, wenn ich ein paar QLabels hab, und ich auswählen will, welches 'oben' liegt!

    Ich sehe nicht, wo dein aktuelles Problem liegt. Für dein gepostetes Programm haben wir ja eine elegante Lösung gefunden. Du hast meiner Meinung nach hier zwei Möglichkeiten:

    1. Du zweigst uns ein Beispielprogramm mit dem tatsächlichen Problem.
    2. Du beschreibst das Problem so, dass es jeder (auch ich) versteht.



  • also:::
    Ich will einen Editor für ein Umfragesystem bauen. Und da gibts verschiedene Module. Die werden im Programm links in einem QListWidget alle angezeigt. Man kann natürlich Module hinzufügen etc.
    Und rechts ist das eigentliche Editorbereich, hier wird dann der Inhalt des jeweils angezeigen Moduls angezeigt. Man kann also zwischen den Modulen hin- und herwechseln. Dazu muss sich der Bereich rechts natürlich verändern.

    Im Moment hab ich das so gelöst, dass der Bereich rechts aus einem QTabWidget besteht. Da es aber zu viele Module sind und die Namen zu lang, würde die "Tableiste", die bei mir oben ist, weit über den Bildschirm hinaus reichen und man müsste sich ewig bis zum gewünschten Modul durchklicken. Also verwende ich das QListWidget links als eine Art 2. Navigation, beim Klicken auf ein Modul hier wird rechts automatisch die richtige Tabseite aufgerufen.

    Das ganze System ist allerdings für den Benutzer ziemlich irreführend ... die (von mir schon deaktivierten) Elemente der Tableiste oben rechts müssten also irgendwie ganz weg ...

    Ist das irgendwie mit vertretbaren Mitteln möglich? Oder müsste man dazu die QTabWidget-Klasse umschreiben? Die hat natürlich angenehme Vorteile eingebaut, wie das nach-unten-scrollen, wenn der Inhalt zu lang wird ...

    Ich könnte mir vorstellen, dass man in einer Liste die Inhalte der rechten Seiten von den ganzen Modulen speichert und dann per Klick auf ein Element im QListWidget links das richtige Widget ins mainlayout einfügt, aber wie realisiere ich das "austauschen" der rechten Seite?



  • "Das ganze System ist allerdings für den Benutzer ziemlich irriführend."

    Wenn du selb st schon so weit bist, dann solltest du NICHT über die Frage
    "Tabwidget oder nicht" nachdenken, sondern erstmal völlig losgelöst von einer
    möglichen Realisierung über eine vernünftige und für den Anwender einfach
    zu bedienende Benutzeroberfläche nachdenken.
    Mit "irgendwie" kommst du nicht weiter: du musst schon selbst wissen wie !



  • Hast du dir schon QStackedWidget angeschaut?
    http://doc.trolltech.com/4.1/qstackedwidget.html


Anmelden zum Antworten