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.
-
-
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