Seite 1 von 1
QDialog: Pflichtfelder
Verfasst: 20. Januar 2010 14:09
von phlox81
Hallo,
wollte mal fragen wie die Standard Lösung in Qt ist, wenn man bei einem Dialog erst die Pflichtfelder ausfüllen muss, bevor man auf Ok klicken kann.
Ich kann natürlich alle Elemente mit entsprechenden Signals besetzen und da entsprechend testen, aber evtl. gehts ja auch einfacher.
Verfasst: 20. Januar 2010 14:31
von AuE
Jepp geht es.....
den Pflichtfeldern nen dynamic property geben und halt erst dann freigeben wenn alle true sind
ala
Code: Alles auswählen
QLineEdit *nameEdit = new QLineEdit(this);
nameEdit->setProperty("mandatoryField", true);
dann im dialog suchst alle widgets durch, schaust ob das property gesetzt ist und entscheidest dann.
ZB verundung aller felder oder sowas
Verfasst: 20. Januar 2010 14:48
von phlox81
Hm, wie meinst du das mit der verundung?
Und wie regelt das property dann das sie ausgefüllt sind?
Verstehe das noch nicht ganz
Auch suche ich eine möglichst generische Lösung, die ich für alle Dialoge verwenden kann.
Auch würde mich interessieren ob man das evtl. im UI File schon regeln kann.
Verfasst: 20. Januar 2010 15:40
von AuE
Auswerten musst du das im Code. Hol dir die Childs des Hauptwidgets und frage deren Propertys ab!
Verfasst: 20. Januar 2010 15:49
von TSS
Ich mache das meistens so, dass ich die textChanged(const QString &)-Signals aller Edit-Felder mit einem Slot verbinde, der dann einfach abfragt, ob diese ausgefüllt sind.
z.B.:
Code: Alles auswählen
button->setEnabled(!edit1->text().isEmpty() && !edit2->text().isEmpty() && !edit3->text().isEmpty());
Verfasst: 20. Januar 2010 15:56
von phlox81
TSS hat geschrieben:Ich mache das meistens so, dass ich die textChanged(const QString &)-Signals aller Edit-Felder mit einem Slot verbinde, der dann einfach abfragt, ob diese ausgefüllt sind.
z.B.:
Code: Alles auswählen
button->setEnabled(!edit1->text().isEmpty() && !edit2->text().isEmpty() && !edit3->text().isEmpty());
So ähnlich habe ich es bisher auch gelöst, und wäre auch am einfachsten.
Verfasst: 20. Januar 2010 16:29
von AuE
und womit bist dabei flexibel?
Code: Alles auswählen
bool bEnableOK = true
foreach ( QWidget *curWdg, this->findChildren<QWidget *>() )
{
QVariant property = curWdg->property("NEEDED");
if (property.isValid() )
{
bEnableOK &= property.toBool();
}
return bEnableOK;
}
// Der Code wurde nur hier geproggt... also kann Fehler enthalten[/code]
Verfasst: 20. Januar 2010 17:06
von phlox81
Was ich bei deiner Lösung jetzt nicht verstehe, ist wie das die Ausgefülltheit der Felder checkt.
Sonst ist das natürlich ok.
Und flexibel, naja, also eigentlich häng ich davor einen Codegenerator (und dem ist es egal

).
Nur hätt ich es halt gern ein schön bzw. wüsste wie man das am besten lösen kann.
Verfasst: 20. Januar 2010 17:23
von AuE
kk...stimmt das hatte ich vergessen
das muss noch dazu
Also checken ob es ein Inputfeld ist und dann string checken ob der empty ist.
dann hast was generisches was auch funzt wenn was hinzufügst!
Code: Alles auswählen
bool bEnableOK = true
foreach ( QWidget *curWdg, this->findChildren<QWidget *>() )
{
QVariant property = curWdg->property("NEEDED");
if (property.isValid() )
{
if(property.toBool() )
{
QLineEdit *le = q_objectcast<QLineEdit *>(curWdg);
if(le) // oder halt anderer typ
{
bEnableOK &= !le.isEmpty()
}
}
return bEnableOK;
}