Salut,
Une des solutions( la plus longue à mettre en place) est de créer ton propre widget, hériterait directement de QGroupBox et qui contiendrait:
- le bouton,
- le spinbox
- un HLayout pour organiser correctement tout cela
- un slot privé auquel connecter le signal du bouton
de manière à pouvoir en créer plusieurs instances de ce widget qui seraient tout à fait "indépendantes" les unes des autres.
Cela prendrait une forme proche de
MyWidget.hpp (nom à adapter
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #ifndef MYWIDGET_HPP
#define MYWIDGET_HPP
#include <QGroupBox>
class QPushButton;
class QDoubleSinbox
class MyWidget : public QGroupBox{
Q_OBJECT;
public:
MyWidget(QString const & title, QWidget * parent = 0);
double value() const; // pour pouvoir récupérer la valeur du spinbox
bool checked() const; // pour savoir si le bouton est checke ou non
private:
void buttonClicked(bool checked);
QPushButton * button;
QDoubleSpinBox *spinbox;
};
#endif //MYWIDGET_HPP |
et l'implémentation ressemblerait à quelque chose comme
MyWidget.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <MyWidget.hpp>
#include <QPushButton>
#include <QSPinBox>
#include <QHBoxLayout>
#include <QGroupBox>
MyWidget::MyWidget(int boxValue, QWidget * parent):QGroupBox{title,parent}{
QString buttonString{QString{"le texte qu'il faut"}};
button = new QPushButton(buttonString);
button->setCheckable(true);
spinbox = new QSpinBox;
spinbox ->setSuffix(" sec");
spinbox ->setDecimals(1);//............Bloque la decimale a 1
spinbox ->setSingleStep(0.1);
spinbox ->setValue(value_shift_min);
spinbox ->setRange(value_shift_min,value_shift_max);
QHBoxLayout * layout = new QHBoxLayout;
layout->addWidget(spinbox);
layout->addWidget(button);
setLayout(layout);
connect(button, &QPushButton::toggled, this, &MyWidget::buttonClicked);
}
/* les deux accesseurs publics: */
double MyWidget::value() const{
return spinbox->value();
}
bool MyWidge::checked() const{
return button->isChecked();
}
void MyWidget::buttonClicked(bool checked){
/* tout ce que tu voudras faire lorsqu'on modifie l'état du bouton */
} |
De cette manière, tu pourras créer une liste de (pointeurs sur) MyWidget, de manière à pouvoir y accéder depuis l'endroit où ils sont affichés, sous une forme proche de
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| /* dans la définition de la classe (le fichier d'en-tête *.h / *.hpp)*/
// je te passe tout le reste
QList(MyWidget *) allSpinboxes;
/* dans implémentation du constructeur (le fichier *.cpp)*/
// je te passe tout le reste
QVBoxLayout * layout = new QVBoxLayout;
for(int i = 0; i< 14; ++i){
MyWidget * temp = new MyWidget(nameLoop[x]);
allSpinBoxes.append(temp);
layout->addWidget(temp);
}
setLayout(layout); |
Une autre solution, plus rapide par rapport à ton code existant, est d'utiliser les expessions lambda pour effectuer le mapping.
Pour se faire, tu devrais sans doute modifier le prototype de ton slot pour lui donner une forme proche de
void buttonChecked(int button, bool checked)
, et modifier ton code pour lui donner une forme proche de
1 2 3 4
| /* tout reste pareil à ce que tu as fait, à part la ligne connect
* qui ressemble désormais à quelque chose comme
*/
connect(BpAux, &QPushButton::toggled, [=](bool checked){this->buttonChecked(i, checked);}); |
(nota : il serait sans doute plus qu'intéressant de placer ad minima les différents spinbox dans une liste qui serait membre de ta classe, de manière à pouvoir en récupérer la valeur quand tu en as besoin
)
Partager