QDialog: Pflichtfelder

Alles rund um die Programmierung mit Qt
Antworten
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

QDialog: Pflichtfelder

Beitrag 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.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag 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.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Auswerten musst du das im Code. Hol dir die Childs des Hauptwidgets und frage deren Propertys ab!
TSS
Beiträge: 73
Registriert: 24. November 2009 15:40
Kontaktdaten:

Beitrag 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());
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag 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.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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]
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag 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 :lol:).
Nur hätt ich es halt gern ein schön bzw. wüsste wie man das am besten lösen kann.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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; 
}
Antworten