Seite 1 von 1
Mit QSpinBox die Anzahl der QLineEdit ändern
Verfasst: 9. April 2010 20:11
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
Verfasst: 9. April 2010 20:27
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?
Verfasst: 9. April 2010 20:33
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.
Verfasst: 9. April 2010 20:45
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

Verfasst: 9. April 2010 20:49
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
Verfasst: 9. April 2010 21:09
von upsala
Füge mal ein show() am Ende deiner Funktion ein...
Verfasst: 9. April 2010 21:17
von MacGyver
Hallo
bringt leider nichts.
Gruß MacGyver
Verfasst: 9. April 2010 21:43
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!
Verfasst: 9. April 2010 21:45
von MacGyver
Hallo
kannst mir dazu kurz nen code posten ?
Gruß Mac.
Verfasst: 9. April 2010 21:57
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.
Verfasst: 9. April 2010 22:38
von MacGyver
Danke für die Antwort.
Nach deinen Denkanstößen klappt es jetzt auch.
Gruß MacGyver