QDialog: Pflichtfelder


  • Mod

    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.

    phlox



  • mir ist keine "einfachere" Lösung bekannt.

    Du könntest natürlich alle Pflichtfelder in einer Liste sammeln, die du der Reihe nach abarbeiten kannst. Im Endeffekt läuft es aber darauf hinaus, alle mit einem entsprechenden Slot zu verbinden.
    Ob du jetzt alle einzeln verbindest oder das über ne Schleife regelst ist dann nur ein Implementierungsdetail


  • Mod

    Bin mit den Properties am überlegen, aber noch auf keinen grünen Zweig gekommen.
    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.



  • hab mal eine Dialog-Klasse gebastelt, die das können sollte, was du brauchst

    habs nicht vollständig durchgetestet und ist sicher noch ausbaufähig, aber vom Grund her funktionierts:

    mydialog.h

    #ifndef MYDIALOG_H
    #define MYDIALOG_H
    
    #include <QDialog>
    
    class QLineEdit;
    
    class MyDialog : public QDialog
    {
        Q_OBJECT
    public:
        explicit MyDialog(QWidget *parent = 0);
    
        void registerMandatoryField(QLineEdit* le, const QString& regexp = "");
        void unregisterMandatoryField(QLineEdit* le);
    
    signals:
        void hasAcceptableInput(bool);
    
    private slots:
        void checkLineEdits();
    
    private:
        QList<QLineEdit*> _mandatoryFields;
    
    };
    
    #endif // MYDIALOG_H
    

    mydialog.cpp

    #include "mydialog.h"
    
    #include <QLineEdit>
    #include <QValidator>
    
    MyDialog::MyDialog(QWidget* parent)
    : QDialog(parent)
    {
    
    }
    
    void MyDialog::registerMandatoryField(QLineEdit* le, const QString& regexp)
    {
        if (!le || _mandatoryFields.contains(le))
            return;
    
        if (regexp != "")
        {
            le->setValidator(new QRegExpValidator(QRegExp(regexp), le));
        }
    
        _mandatoryFields.append(le);
    
        QObject::connect(le, SIGNAL(textChanged(const QString&)), this, SLOT(checkLineEdits()));
    }
    
    void MyDialog::unregisterMandatoryField(QLineEdit* le)
    {
        if (!le || !_mandatoryFields.contains(le))
            return;
    
        QObject::disconnect(le, 0, 0, 0);
    
        _mandatoryFields.removeAll(le);
    }
    
    void MyDialog::checkLineEdits()
    {
        bool b = true;
    
        for (QList<QLineEdit*>::iterator iter = _mandatoryFields.begin(); iter != _mandatoryFields.end(); ++iter)
        {
            QLineEdit* le = *iter;
    
            if (le == NULL)
                continue;
    
            if (le->text().isEmpty() || !le->hasAcceptableInput())
            {
                b = false;
                break;
            }
        }
    
        emit hasAcceptableInput(b);
    }
    

    Deine LineEdits einfach über registerMandatoryField einhängen und deinen (standardmäßig deaktivierten) Ok-Button mit dem Signal verbinden

    Es ist zwar vielleicht nicht so einfach, wie du es gerne haben würdest, aber das ganze in einer Basisklasse zu "verstecken" scheint mir die sinnvollste Lösung. Vor allem kannst du so auch zum Beispiel farbliche Hervorhebungen machen, die dann in jedem Dialog deiner Anwendung automatisch übernommen werden


Anmelden zum Antworten