QWidget verändern/aktualisieren

Alles rund um die Programmierung mit Qt
Antworten
sam_max
Beiträge: 5
Registriert: 5. Juni 2008 13:45

QWidget verändern/aktualisieren

Beitrag 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.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
sam_max
Beiträge: 5
Registriert: 5. Juni 2008 13:45

Beitrag 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();
sam_max
Beiträge: 5
Registriert: 5. Juni 2008 13:45

Beitrag 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?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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 :-)
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
sam_max
Beiträge: 5
Registriert: 5. Juni 2008 13:45

Beitrag 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.
sam_max
Beiträge: 5
Registriert: 5. Juni 2008 13:45

Beitrag 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.
Antworten