Dynamische Checkliste zugriff auf CheckBox



  • Hallo ihr lieben,

    Ich bin momentan dabei eine Dynamische Checkliste zu erstellen. Dabei werden im ersten Fenster Namen für die Checkliste geschrieben und an ein zweites Fenster übergeben um die Checklist zu erstellen mit hilfe von Checkboxen. Das zweite Fenster sieht folgendermaßen aus:

    h datei:

    #ifndef DYNCHECKLIST_H
    #define DYNCHECKLIST_H
    
    #include <QWidget>
    #include <vector>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    #include <iostream>
    #include <QCheckBox>
    #include <QString>
    #include <QMainWindow>
    #include <QLabel>
    
    using namespace std;
    
    class DynCheckList : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit DynCheckList(QWidget* parent = 0);
        DynCheckList(vector<string> text);
        ~DynCheckList();
    
    private slots:
        void checked(int state);
        void save_clicked();
        void savePrint_clicked();
    
    private:
        vector<string> text;
        vector<class QCheckBox> boxes;
        QVBoxLayout* layout;
        QLabel* label;
        QCheckBox* checkBox;
        int number = 0;
        int check = 0;
    };
    
    #endif // DYNCHECKLIST_H
    

    cpp datei:

    #include "dynchecklist.h"
    
    DynCheckList::DynCheckList(QWidget *parent) :
        QWidget(parent)
    {
    
    }
    
    DynCheckList::DynCheckList(vector<string> text)
    {
        //create window, layouts, label
        this->text = text;
    
        QWidget* window = new QWidget(this);
        layout = new QVBoxLayout;
        QVBoxLayout* mainlayout = new QVBoxLayout;
        QVBoxLayout* checkBoxLayout = new QVBoxLayout;
        QHBoxLayout* buttonLayout = new QHBoxLayout;
    
        label = new QLabel;
        QPushButton* save = new QPushButton;
        QPushButton* savePrint = new QPushButton;
    
        save->setText("Speichern");
        savePrint->setText("Speichern und Drucken");
    
        int hight = 155;
    
        for(int i = 0; i<text.size();i++)
        {
            QString str = QString::fromStdString(text[i]);
            checkBox = new QCheckBox;
            checkBox->setText(str);
            checkBoxLayout->addWidget(checkBox);
    
            checkBox->setObjectName("checkbox"+QString::number(i));
            boxes.push_back(checkBox);
    
            hight += 10;
    
            //Action for QCheckBox
            connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(checked(int)));
        }
    
        //add widgets and layouts, set position
        checkBoxLayout->addWidget(label);
    
        checkBoxLayout->setAlignment(Qt::AlignTop);
        checkBoxLayout->addLayout(buttonLayout);
        label->setAlignment(Qt::AlignBottom);
    
        buttonLayout->addWidget(save);
        buttonLayout->addWidget(savePrint);
        buttonLayout->setAlignment(Qt::AlignBottom);
    
        mainlayout->addLayout(layout);
        mainlayout->addLayout(checkBoxLayout);
        window->setLayout(mainlayout);
        window->setMinimumSize(hight, 200);
    
        //Action for buttons
        connect(save, SIGNAL(clicked()), this, SLOT(save_clicked()));
        connect(savePrint, SIGNAL(clicked()), this, SLOT(savePrint_clicked()));
    }
    

    Nun möchte ich gerne auf die checkBoxen zugreifen:

    for(int i = 0; i<text.size();i++)
        {
            QString str = QString::fromStdString(text[i]);
            checkBox = new QCheckBox;
            checkBox->setText(str);
            checkBoxLayout->addWidget(checkBox);
            hight += 10;
            checkBox->setObjectName("checkbox"+QString::number(i));
            boxes.push_back(checkBox);
    
            //Action for QCheckBox
            connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(checked(int)));
        }
    

    Dafür habe ich sie eigentlich extra in einen Vector gepackt. Aber ich schaffe es nicht darauf zu zu greifen. Im endeffekt möchte ich gerne den Status abfragen um das ganze zu speichern.

    Es wird eine Datei erstellt werden und wenn der Status "True" ist soll zb. dann "Erledigt" dahinter stehen und bei "False" halt nichts oder "nicht erledigt".

    Vielleicht könnt ihr mir helfen?
    Habe es über for schleife und iterator versucht bisher. Vielleicht gibt es eine bessere möglichkeit das ganze zu machen?

    Liebe grüße und danke im vorraus Lillith



  • Hallo,

    mir ist nicht ganz klar, was du da machst. Grob würde ich so was vorschlagen:

    // "h datei"
    ...
    private:
    ...
        vector<QCheckBox*> boxes; // du willst doch die Pointer haben
        // QCheckBox* checkBox; wozu brauchst du das?
    
    // "cpp datei"
    ...
    for(int i = 0; i<text.size();i++)
    {
      QCheckBox* checkBox = new QCheckBox;
      checkBox->setText(str);
      checkBoxLayout->addWidget(checkBox);
    
      checkBox->setObjectName("checkbox"+QString::number(i));
      boxes.push_back(checkBox);
    ...
    }
    ...
    // Zugreifen
    for(auto& box : boxes)
    {
      if(box->checked())
        tueDies();
      else
        tueDas();
    }
    


  • QCheckbox* checkbox ist einfach nur eine variable womit ich in der cpp die checkboxen erstelle, aber hast recht kann ich auch ganz in der cpp machen. Wollte ursprünglich auf checkBox in einer anderen methode zugreifen.

    Danke das werde ich mal ausprobieren.

    Gruß Lillith



  • Habe das jetzt so übernommen in der h:

    vector<QCheckBox*> boxes;
    

    cpp:

    void DynCheckList::save_clicked()
    {
        for(auto& box : boxes)
        {
            if(box->checked())   //sagt mir aber an dieser stelle checked ist kein
                                 //Element von QCheckBox
            {
                cout << "true" << endl;
            }
         ....
        }
    }
    


  • Oh, halben Text vergessen. Kommt immer die Fehlermeldung die ich als Kommentar reingeschrieben habe.



  • 🙄
    Dann halt isChecked(). Hab jetzt nicht das qt interface im Kopf.
    Dachte, das könntest du auch selber nachgucken.



  • Schau doch in die Doku hier und hier.



  • Danke euch, es funktioniert jetzt.



  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du musst die Checkboxen nicht im Vector speichern. Du kannst im SLOT(checked(int)) mit

    QCheckBox* checkbox = (QCheckBox*)QObject::sender() ;
    

    darauf zugreifen.

    Und beim Speichern, dein Widget nach Child-Object durchsuchen.

    QList<QCheckBox*> checkboxList = .... parentWidget()->findChildren<QCheckBox*>();
    foreach(QcheckBox* c, checkboxList)
    {
        c->  //machwas
    }
    

    In dein Fall ist es egal, aber sonst müsstest du dein Vector aufräumen, falls eine Checkbox gelöscht wurde.

    Aber es führen viele Wege nach Rom 🙂


Anmelden zum Antworten