Seite 1 von 1

QWidget verändern/aktualisieren

Verfasst: 10. Juli 2008 12:46
von sam_max
Hallo ich habe in einer Ui ein Widget folgendermaßen erzeugt (Auszug):

Code: Alles auswählen

    verticalLayout = new QWidget(centralwidget);
    verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
    verticalLayout->setGeometry(QRect(100, 0, 491, 651));
    vboxLayout = new QVBoxLayout(verticalLayout);
    vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
    vboxLayout->setContentsMargins(0, 0, 0, 0);
    liste = new Liste(verticalLayout);
    liste->setObjectName(QString::fromUtf8("liste"));

    vboxLayout->addWidget(liste);
Dies geschieht bei der Initialisierung. Er lädt auch die Klasse Liste. Allerdings will ich nun in diese Klasse Liste (ist ein QWidget) weitere HBoxen einfügen. Habe dies folgendermaßen versucht:

Code: Alles auswählen

    horizontalLayout = new QWidget(this);
    horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
    horizontalLayout->setGeometry(QRect(30, 20, 371, 111));
    hboxLayout = new QHBoxLayout(horizontalLayout);
    hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
    hboxLayout->setContentsMargins(0, 0, 0, 0);
QSizePolicy::Expanding, QSizePolicy::Minimum);
    einheit = new Einheit(horizontalLayout);
    einheit->setObjectName(QString::fromUtf8("einheit"));
    hboxLayout->setSpacing(1);
    hboxLayout->addWidget(recheneinheit);
    //this->update();
    emit rechneradded();
Das Widget Einheit soll bei klicken eines Buttons eingefügt werden. Durch Konsolenausgaben weiß ich auch, dass das Programm die Hinzufügefunktion bei klicken besucht, sollte also funktionieren.
In der Klasse in welcher der erste Codeteil steht, habe ich versuchsweise nun noch:

Code: Alles auswählen

void mainapp::test(){
    std::cout<<"TEST";
    //liste->repaint();
    vboxLayout->update();
}
eingefügt, doch er gibt mir nur das "TEST" aus. Wie kann ich nachträglich ein QWidget verändern, bzw. Elemente hinzufügen?

Habs mit dem Designer versucht, doch dieser spuckt mir ähnlichen Code aus, nur dass er diesen ja beim starten des Programms ausführt, und das Design nachträglich nicht mehr verändert werden kann.

Verfasst: 10. Juli 2008 14:04
von macman
verticalLayout ist doch bestimmt schon gesetzt und Du überschreibst es mit einem neuen Layout, oder? Nur so als Hinweis. Ausserdem sollten Objektnamen eindeutig sein.

Verfasst: 10. Juli 2008 15:34
von sam_max
Das verticalLayout existiert in meinem MainWindow, das war der angegebene Code, danach wird der Name nicht wieder verwendet oder neu erzeugt. Ich will in das bestehende weitere Elemente hinzufügen.
Bislang sind auch alle Namen eindeutig. Für diesen Zweck habe ich zwei Buttons, welche unterschiedliche Namen vergeben, selbst die Instanzen heißen unterschiedlich. Diese werden im späteren Verlauf auch Eindeutig bleiben, da sie beim erzeugen manuell einen Namen bekommen.

Als erstes will ich jedoch überhaupt was sehen und zu diesem Zweck sind die Funktionen der Buttons mit vordefinierten Werten "gefüttert".

Dieser Code ist in der Klasse Liste, weswegen ich dem QWidget auch this als parent übergebe.

Code: Alles auswählen

    horizontalLayout = new QWidget(this);
    horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
    horizontalLayout->setGeometry(QRect(30, 20, 371, 111));
    hboxLayout = new QHBoxLayout(horizontalLayout);
    hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
    hboxLayout->setContentsMargins(0, 0, 0, 0);
QSizePolicy::Expanding, QSizePolicy::Minimum);
    einheit = new Einheit(horizontalLayout);
    einheit->setObjectName(QString::fromUtf8("einheit"));
    hboxLayout->setSpacing(1);
    hboxLayout->addWidget(recheneinheit);
    //this->update();
    emit rechneradded();

Verfasst: 11. Juli 2008 13:44
von sam_max
wenn ich in meiner Klasse Liste den Befehl:

Code: Alles auswählen

horizontalLayout->show();
einfüge erhalte ich zwar das QWidget, jedoch nicht di darin enthaltenen Widgets, z.B. das QListWidget, welches innerhalb des QWidgets sein soll.
Weiß niemand eine Möglichkeit ein verändertes QWidget zu aktualisieren oder wie ich eventuell besser ein eine QWidget-Klasse in eine bestehende einfügen kann?

Verfasst: 11. Juli 2008 15:10
von macman
Ich arbeite relativ viel mit dynamisch erzeugten Widgets und hatte eigentlich nie Probleme. Aus deinem Code ist zu wenig ersichtlich, da bräuchte es schon etwas Testbares. Wenn Du also ein kleines Testprojekt erstellen kannst, dann nur her damit. Vor Montag werde ich mich dessen aber nicht annehmen :-)

Verfasst: 14. Juli 2008 11:18
von sam_max
Ich versuche heute nochmal einen etwas anderen Ansatz, weil ich denke, dass meine Klasse Liste nicht fähig ist neue Elemente aufzunehmen, da es eine QWidget Klasse ist und dafür gibts ja keine add-Funktionen. Und ich glaube nicht dass es dafür reicht Liste als parent anzugeben.

Werde es ohne die Klasse Liste versuchen und die Elemente direkt in das QVBoxLayout einzufügen.
Falls dies auch nicht tut, bastel ich ein Beispielprojekt mit meiner Idee.

Danke für die Antwort.

Verfasst: 15. Juli 2008 14:24
von sam_max
So ich bin nun glaube ich auf dem richtigen Weg. Ich füge die QWidgets nun direkt in das hBoxLayout ein. Die Klasse Liste lag stehts über dem eingefügten Element, trotz dessen dass Liste der parent des Elements war. Lediglich mit show() war es möglich das hinterliegende QWidget zu sehen (jedoch ohne dessen Elemente.)
Danke macman fürs anstoßen, durch den Post kam mir irgendwie der Gedanke es anders zu versuchen.