Dynamisch auf Oberflächen Elemente zugreifen



  • Moin,

    ich lese aus einem FPGA Register (ca. 50) aus. Wenn ich die Daten aus einem Register habe möchte ich das Datum in ein Feld auf der Oberfläche eintragen.

    Den einzelnen Registern sind etweder checkboxen oder lineEdits zugeordnet.

    Wie bekomme ich das jetzt am besten hin, dass ich nicht für jedes Register eine eigene Funktion im Sinne von

    setLineEdit_XYZ(char *data)
    

    benötige, sondern lediglich eine Funktion.

    item = lookupById(register.id);
    item->setText(register.data);
    

    Ich hoffe, dass mir da jemand helfen kann.

    Danke im Voraus
    Matze-o



  • Ja, Du könntest z.B. Deine items in eine Map oder ein Array packen und das dann nach der ID durchsuchen.



  • Danke,

    welchen Typ muss der Array dann haben, wenn ich Checkboxen und lineEdits habe? QWidget?

    Ist es so richtig?

    QWidget *items[]={
    lineEdit_1,
    lineEdit_2,
    checkbox_1,
    checkbox_2
    };
    items[getById(register)]->setText(data);
    


  • Dir ist schon aufgefallen, dass es in diesem Forum auch um Qt geht, oder? 🙂

    Du könntest ein Array der Basisklassen benutzen, ja, aber nur wenn diese Basisklasse bereits die Funktion setText anbietet. Das ist aber leider nicht der Fall.

    Wenn Du boost benutzen kannst, würde ich die setText-Funktionen an das Objekt binden und dadurch eine einzige Set-Funktion in eine Map packen. Alternativ kannst Du natürlich ein Array nehmen und die Arrayposition selbst beim Durchlaufen des Arrays feststellen.

    Beispiel:

    #include <map>
    #include <boost/bind.hpp>
    #include <boost/function.hpp>
    
    /* Initialisierung der Map */
    typedef boost::function< void ( QString const& ) > setText_func;
    typedef std::map< QString, setText_func > setText_map;
    
    setText_map setters;
    setters[ "abc" ] = boost::bind( &QLineEdit::setText, &lineEdit_1, _1 );
    setters[ "xyz" ] = boost::bind( &QCheckBox::setText, &checkBox_1, _1 );
    
    /* Benutzung der Map */
    
    /* Überprüfen, ob Eintrag vorhanden */
    setText_map::const_iterator iter = setters.find( register.id );
    if ( iter != setters.end() ) {
        /* Eintrag vorhanden */
        (*iter)( register.data );
    }
    
    /* Ohne Überprüfung, wenn Du sicher bist dass der Eintrag existiert */
    setters[ register.id ]( register.data );
    


  • Boost habe ich leider noch nie benutzt.

    Ich habe auch shcon gemerkt, dass QWidget leider kein SetText hat 🙂

    Ich habe jetzt einfach zwei Arrays genommen, die erfüllen auch ihren Nutzen.

    Über den Zugriff über den Array muss ich mir noch Gedanken machen, aber ich denke das bekomme ich hin.

    Danke für die Hilfe.



  • Speicher' jedes Widget mit der zugehoerigen Registernummer in einer Map oder einem Array:

    QMap<int,QWidget*> RegisterMap;
    
    QLineEdit *edit= new QLineEdit(...);
    RegisterMap.insert(1, edit);
    
    QCheckBox *check= new QCheckBox(...);
    RegisterMap.insert(2, check);
    ...
    

    Wenn ein Register "nr" ausgelesen wurde, hole das zugehoerige Widget und behandle es entsprechend seines Typs:

    QWidget *widget= RegisterMap[nr];
    if (widget->inherits("QCheckBox"))
    {
      QCheckBox *check= (QCheckBox*)widget;
      check->setCheckState(...);
    }
    else
    if (widget->inherits("QLineEdit"))
    {
      QLineEdit *edit= (QLineEdit*)widget;
      edit->setText(...);
    }
    

Anmelden zum Antworten