Mit QSpinBox die Anzahl der QLineEdit ändern

Alles rund um die Programmierung mit Qt
Antworten
MacGyver
Beiträge: 24
Registriert: 7. November 2007 16:27

Mit QSpinBox die Anzahl der QLineEdit ändern

Beitrag von MacGyver »

Hallo

ich wollte mit einer SpinBox die Anzahl der LineEdits zur lauf zeit ändern.

Folgender Gedanke:

Code: Alles auswählen

connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(createFormGroupBoxb(int)));

Code: Alles auswählen

formGroupBoxb = new QGroupBox(tr("BlaBlaBla"));
    QFormLayout *layout = new QFormLayout;

      for (int a = 0; a < i; ++a) {
        labels = new QLabel(tr("Line %1:").arg(a + 1));
        //lineEdits = new QLineEdit;
        layout->addWidget(labels);
        //layout->addWidget(lineEdits);
    }

    formGroupBoxb->setLayout(layout);
Funktioniert aber leider nicht so, hat wer eine idee ?

Gruß MacGyver
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

*) "Funktioniert so nicht" ist keine Fehlerbeschreibung. Sag mal genauer was nicht geht!
*) Hast du da ein saftiges Memory-Leak, da deine formGroupBoxb mit jedem Spinbox-Ändern neu erstellt, die alte Instanz aber nicht gelöscht wird.
*) Wie fügst du die GroupBox in dein bestehendes Fenster ein?
MacGyver
Beiträge: 24
Registriert: 7. November 2007 16:27

Beitrag von MacGyver »

Hallo

hier mal der komplette code.

Code: Alles auswählen

Dialog::Dialog(QWidget *parent) : QDialog(parent)
{
    createFormGroupBoxa();
    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(formGroupBoxa);
    mainLayout->addWidget(formGroupBoxb);
    setLayout(mainLayout);
    setWindowTitle(tr("Test 1"));
}

void Dialog::createFormGroupBoxa()
{
    formGroupBoxa = new QGroupBox(tr("Test 2"));
    QFormLayout *layout = new QFormLayout;
    layout->addRow(new QLabel(tr("Test 3 :")), a = new QLineEdit);
    layout->addRow(new QLabel(tr("Test 4 :")), b = new QLineEdit);
    layout->addRow(new QLabel(tr("Test 5 :")), c = new QLineEdit);
    layout->addRow(new QLabel(tr("Test 6 :")), d = new QLineEdit);
    layout->addRow(new QLabel(tr("Test 7 :")), e = new QLineEdit);
    layout->addRow(new QLabel(tr("Test 8 :")), f = new QSpinBox);
    spinbox->setValue(5);
    createFormGroupBoxb(spinbox->value());

    connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(createFormGroupBoxb(int)));

    formGroupBoxa->setLayout(layout);
}

void Dialog::createFormGroupBoxb(int i)
{
    formGroupBoxb = new QGroupBox(tr("Fehlerklasse der Fehlersammelkarte"));
    QFormLayout *layout = new QFormLayout;

      for (int a = 0; a < i; ++a) {
        labels = new QLabel(tr("Line %1:").arg(a + 1));
        //lineEdits = new QLineEdit;
        layout->addWidget(labels);
        //layout->addWidget(lineEdits);
    }

    formGroupBoxb->setLayout(layout);
}
Es kommt keine Fehlermeldung.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

MacGyver hat geschrieben:Es kommt keine Fehlermeldung.
Ich will keine FehlerMELDUNG sondern eine FehlerBESCHREIBUNG.
Z.B. "Ich ändere die SpinBox, aber es wird mein neues formGroubBoxB nicht angezeigt".
Dann sage ich "Du fügst es in createFormGroupBoxb auch nicht ins mainlayout ein".
Usw.
BTW hättest du meine Katalog aus dem ersten Post nicht nach der Beantwortung des ersten Punktes abbrechen sollen ;)
MacGyver
Beiträge: 24
Registriert: 7. November 2007 16:27

Beitrag von MacGyver »

Hallo
ok da hst du recht.
1. Es werden die LineEdits nicht neu erstellt, nur die die schon
per spinbox->setValue(5); vorgegeben sind.
2. Das stimmt, stört mich aber momentan nicht da ich nur etwas probieren will.
3. Über die Funktion createFormGroupBoxa(); dachte ich?!??

Gruß MacGyver
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Füge mal ein show() am Ende deiner Funktion ein...
MacGyver
Beiträge: 24
Registriert: 7. November 2007 16:27

Beitrag von MacGyver »

Hallo

bringt leider nichts.

Gruß MacGyver
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Das formGroupBoxb, das du in der Funktion jedesmal neu generierst, ist ein anderes als das welches du im Konstruktor in das mainlaout legst!
Du musst am Ende von createFormGroupBoxb() das neu erstellte formGroupBoxb wieder ins mainlayout legen - nachdem du das alte Element herausgenommen und gelöscht hast!
MacGyver
Beiträge: 24
Registriert: 7. November 2007 16:27

Beitrag von MacGyver »

Hallo

kannst mir dazu kurz nen code posten ?

Gruß Mac.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Code: Alles auswählen

int index = mainlayout->indexOf(formGroupBoxb);
mainlayout->removeWidget(formGroupBoxb);
delete formGroupBoxb;
// formGroupBox neu erstellen
// lineEdits hinzufügen
// usw.
mainlayout->insertWidget( index, formGroupBoxb);
Du kannst natürlich das Löschen bleiben lassen und direkt die widgets ins bereits exisierende layout von formGroupBoxb einfügen / löschen.
Das überlass ich aber dir, mit dem Gezeigten sollte der Weg klar sein.
MacGyver
Beiträge: 24
Registriert: 7. November 2007 16:27

Beitrag von MacGyver »

Danke für die Antwort.
Nach deinen Denkanstößen klappt es jetzt auch.

Gruß MacGyver
Antworten