IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Plage horaire pour une configuration quotidienne

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut Plage horaire pour une configuration quotidienne
    Bonjour à tous,

    Mon projet a pour but de developper un systeme automatisée permettant de gérer des conditions climatiques prédéfinies ou forcées à l'intérieur d'une serre de culture.
    Je suis responsable de la partie developpement du software et je bloque sur la gestion des plages :
    Le système doit permettre de définir 7 journées types (1H de résolution)
    J'ai choisi de coder ça sous Design et j'aimerais qu'a l'appui du bouton enregistrer : l'ensemble des valeurs des spins box de l'onglet actif sois récupérer quelque part afin que je puisse les envoyé à une SGBD apres.
    Nom : plage horraire.png
Affichages : 3510
Taille : 28,5 Ko
    Pour l'envoie à la SGBD je n'ai pas de soucis tous est pret me reste juste à recupérer les valeurs de la config de la journée.
    Je vous met un screen de ce que j'ai fais sous Design.

    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Une petite précision avant de commencer : je ne suis pas fan du tout du designer. Lorsque je peux m'en passer, j'aime autant créer mes propres widgets par programmation. C'est ce que je vais mettre en avant ici

    La première chose que je ferais, étant donné que l'on a besoin des même éléments graphique pour toutes les plages horaires, c'est de créer un widget particulier qui me les fournirait, sous une forme qui pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class TimeSlot : public QWidget{
        Q_OBJECT
    public:
        TimeSlot(int hour);
        /* parce qu'il faudra bien sauvegarder les informations :D */
        void save();
    private:
        QSpinBox * temperature;
        QSpinBox * humidity;
        QSpinBox * luminosity;
    };
    dont l'implémentation pourrait ressembler à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    TimSlot::TimeSlot(int hour){
         QLabel * label = new QLabel(QString::number(hour));
        temperature = new QSpinBox;
        humidity = new QSpinBox;
        luminosity = new QSpinBox;
        QHBoxLayout * layout = new QHBoxLayout;
        layout->addWidget(label);
        layout->addWidget(temperature);
        layout->addWidget(humidity);
        layout->addWidget(luminosity);
        setLayout(layout);
    }
    void TimeSlot::save(){
        /* ce qu'il faudra faire ici */
    }
    Et, parce que j'aime bien me faciliter la vie, je créerais sans doute un deuxième widget pour les "en-têtes " de colonnes. Il serait sans doute encore plus simple, vu qu'il prendrait une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class ColumnHeaders : public QWidget{
        Q_OBJECT
    public:
        ColumnHeaders();
    };
    et l'implémentation ressemblerait à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ColumnHeaders::ColumnHeaders(){
        QLabel * hour = new QLabel(tr("Heure :"));
        QLabel * temperature = new QLabel(tr("Température °"));
        QLabel * humidity = new QLabel(tr("Humidité %"));
        QLabel * luminosity = new QLabel(tr("Luminosité %"));
        QHBoxLayout * layout = new QHBoxLayout;
        layout->addWidget(hour);
        layout->addWidget(temperature);
        layout->addWidget(humidity);
        layout->addWidget(luminosity);
        setLayout(layout);
    }
    (NOTA : j'ai utilisé tr pour le cas où tu envisagerais de traduire ton interface graphique dans d'autres langues )

    A l'aide de ces deux widgets, j'aurais créé un troisième qui représentera le planning d'une journée sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Planning : public QWidget{
        Q_OBJECT
    public:
        Planning();
        /* parce que l'on veut pouvoir sauvegarder le planning entier */
        void save();
    private:
        /* parce que pour sauvegarder le planning, il faut pouvoir accéder à 
         * toutes les plages horraires
         */
        QList<TimeSlot * > allSlots;
    };
    Avec une implémentation qui prendrait une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Planning::Planning(){
        QVBoxLayout * layout = new QVBoxLayout;
        /* d'abord, les en-têtes */
        ColumnHeaders * headers = new ColumnHeaders;
        layout->addWidget(headers);
        /* ensuite, les 24 plages horaires */
        for(int i = 0; i<24; ++i){
            TimeSlot * temp = new TimeSlot(i);
             layout->addWidget(temp);
             allSlots.append(temp);
        }
        setLayout(layout);
    }
    void Planning::save(){
        for(auto * it : allSlots)
            it->save();
    }
    Dans "l'élément final" qui affiche le planning et qui propose l'enregistrement, je n'aurais donc plus eu qu'à créer un planning et à connecter le signal clicked du bouton "Enregistrer" à un slot qui aurait pu prendre lla forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void MyForm::onSaveClicked(){
        planning->save()
    }
    Et le tout m'aurais demandé... 15 minutes de travail (maxi )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut
    Bonjour Koala merci de ta réponse.

    Je n'ai pas un super niveau en programmation QT et c'est pour cela que j'ai choisi designer qui me paraissait plus simple ^^
    De plus je ne vois pas comment afficher le planning et obtenir les configuration que l'utilisateur a rentré dans les SPINBOX ?
    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    #include <QApplication>
    #include <QtWidgets>
     
    class TimeSlot : public QWidget{
        Q_OBJECT
    public:
        TimeSlot(int hour);
        /* parce qu'il faudra bien sauvegarder les informations :D */
        void save();
    private:
        QSpinBox * temperature;
        QSpinBox * humidity;
        QSpinBox * luminosity;
    };
    TimeSlot::TimeSlot(int hour){
        QLabel * label = new QLabel(QString::number(hour));
        temperature = new QSpinBox;
        humidity = new QSpinBox;
        luminosity = new QSpinBox;
        QHBoxLayout * layout = new QHBoxLayout;
        layout->addWidget(label);
        layout->addWidget(temperature);
        layout->addWidget(luminosity);
        setLayout(layout);
    }
    void TimeSlot::save(){
        /* ce qu'il faudra faire ici */
    }
    class ColumnHeaders : public QWidget{
        Q_OBJECT
    public:
        ColumnHeaders();
    };
     
     
    ColumnHeaders::ColumnHeaders(){
        QLabel * hour = new QLabel(tr("Heure :"));
        QLabel * temperature = new QLabel(tr("Température °"));
        QLabel * humidity = new QLabel(tr("Humidité %"));
        QLabel * luminosity = new QLabel(tr("Luminosité %"));
        QHBoxLayout *layout = new QHBoxLayout;
        layout->addWidget(humidity);
        layout->addWidget(temperature);
        layout->addWidget(luminosity);
        setLayout(layout);
    }
    class Planning : public QWidget{
        Q_OBJECT
    public:
        Planning();
        /* parce que l'on veut pouvoir sauvegarder le planning entier */
        void save();
    private:
        /* parce que pour sauvegarder le planning, il faut pouvoir accéder à
         * toutes les plages horraires
         */
        QList<TimeSlot * > allSlots;
    };
    Planning::Planning(){
        QVBoxLayout * layout = new QVBoxLayout;
        /* d'abord, les en-têtes */
        ColumnHeaders * headers = new ColumnHeaders;
        layout->addWidget(headers);
        /* ensuite, les 24 plages horaires */
        for(int i = 0; i<24; ++i){
            TimeSlot * temp = new TimeSlot(i);
             layout->addWidget(temp);
             allSlots.append(temp);
        }
        setLayout(layout);
    }
    void Planning::save(){
        for(auto *it : allSlots)
            it->save;
    }
     
    int main(int argc, char *argv[])
    {
     
        QApplication a(argc, argv);
     
        Planning w;
        w.show();
     
        return a.exec();
    }

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par abii93200 Voir le message
    De plus je ne vois pas comment afficher le planning et obtenir les configuration que l'utilisateur a rentré dans les SPINBOX ?
    C'est justement là toute la beauté du système de parent/enfants de Qt: tu n'as pas à t'en inquiéter!!!

    Chaque widget est prévu pour afficher le contenu de son layout, quel qu'il soit.

    Comme je créer systématiquement un layout (dans TimeSlot, dans ColumnsHeaders et dans Planning), dans lequel je rajoute des widgets et que je défini comme layout pour la classe en question, ils seront forcément affichés

    Du coup, tu pourrais tout aussi bien afficher le planning avec un code aussi simple que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "planning.h"
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Planning p;
        p.show();
     
        return a.exec();
    }
    J'ai, pour l'exemple, réduit le nombre de plages à 12 (pour ne pas faire une image trop grande), et j'ai obtenu ceci:
    Nom : planning.png
Affichages : 1038
Taille : 23,5 Ko
    Avoue que c'est génial, non ?

    Ensuite, rien ne t'empêche de créer un widget qui regroupe ton planning et un bouton (pour lequel tu connecterait le signal clicked() à la fonction save() de ton planning), puis de rajouter ce widget dans un QTabWidget, et d'afficher ce QTabWidget "perso" (ou d'utiliser ce QTabWidget comme widget central dans une QMainWindow). Et le tour serait joué
    Images attachées Images attachées  
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Allez, comme je suis vraiment trop sympa, j'ai même créer le projet en entier, qui sauvegarde les données au format csv (dont le nom est config<Numéro de config>.csv ), et je te l'ai mis sur github

    J'ai un peu modifié la mise en page, car 24 lignes de plages horaires, je trouvais que cela donnait vraiment un résultat un peu trop "haut"... Mais tout est là et le résultat ressemble à ceci:
    Nom : config_application.png
Affichages : 1025
Taille : 40,1 Ko
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut
    Comme je créer systématiquement un layout (dans TimeSlot, dans ColumnsHeaders et dans Planning), dans lequel je rajoute des widgets et que je défini comme layout pour la classe en question, ils seront forcément affichés
    Ensuite, rien ne t'empêche de créer un widget qui regroupe ton planning et un bouton
    Du coup je dois rajouter un layout dans le nouveau widget que je vais crée ?

    C'est bon j'arrive à afficher le planning ca progresse
    Une fois les configurations rentrés et que le bouton enregistrer a été appuyé je dois envoyé cela à une BDD au travers de datagram UDP cela ce fera donc dans la fonction save() ?
    J'ai deja mon sender de pret
    J'ai crée un nouveau Widget pour regrouper le planning et le bouton mais je sais pas trop comment faire :/
    De plus je n'arrive pas a utiliser la fonction save pour le connect du bouton enregistrer je te met mon code :
    MERCI !!!

    .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    class TimeSlot : public QWidget{
        Q_OBJECT
    public:
        TimeSlot(int hour);
        /* parce qu'il faudra bien sauvegarder les informations :D */
        void save();
    private:
        QSpinBox * temperature;
        QSpinBox * humidity;
        QSpinBox * luminosity;
    };
     
     
    class ColumnHeaders : public QWidget{
        Q_OBJECT
    public:
        ColumnHeaders();
    };
     
    class Planning : public QWidget{
        Q_OBJECT
    public:
        Planning();
        /* parce que l'on veut pouvoir sauvegarder le planning entier */
        void save();
    private:
        /* parce que pour sauvegarder le planning, il faut pouvoir accéder à
         * toutes les plages horraires
         */
        QList<TimeSlot * > allSlots;
    };
    class Planningetbouton : public QWidget{
        Q_OBJECT
        public
     
     
        private:
        QPushButton *Enregistrer;
     
        private slots:
        void enregistrer();
    }
    .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include "mainwindow.h"
     
    TimeSlot::TimeSlot(int hour){
         QLabel * label = new QLabel(QString::number(hour));
        temperature = new QSpinBox;
        humidity = new QSpinBox;
        luminosity = new QSpinBox;
        QHBoxLayout * layout = new QHBoxLayout;
        layout->addWidget(label);
        layout->addWidget(temperature);
        layout->addWidget(humidity);
        layout->addWidget(luminosity);
        setLayout(layout);
    }
    void TimeSlot::save()
    {
        /* ce qu'il faudra faire ici */
    }
     
     
        ColumnHeaders::ColumnHeaders(){
        QLabel * hour = new QLabel(tr("Heure :"));
        QLabel * temperature = new QLabel(tr("Température °"));
        QLabel * humidity = new QLabel(tr("Humidité %"));
        QLabel * luminosity = new QLabel(tr("Luminosité %"));
        QHBoxLayout * layout = new QHBoxLayout;
        layout->addWidget(hour);
        layout->addWidget(temperature);
        layout->addWidget(humidity);
        layout->addWidget(luminosity);
        setLayout(layout);
    }
     
        Planning::Planning(){
        QVBoxLayout * layout = new QVBoxLayout;
        /* d'abord, les en-têtes */
        ColumnHeaders * headers = new ColumnHeaders;
        layout->addWidget(headers);
        /* ensuite, les 24 plages horaires */
        for(int i = 0; i<24; ++i){
            TimeSlot * temp = new TimeSlot(i);
             layout->addWidget(temp);
             allSlots.append(temp);
        }
        setLayout(layout);
    }
    void Planning::save()
    {
        for(auto * it : allSlots)
            it->save();
    }
    Planningetbouton::Planningetbouton()
    {
        QPushButton *Enregistrer = new QPushButton;
     
    }
     
    void Planningetbouton::enregistrer()
    {
        connect(Enregistrer,SIGNAL(clicked()),this,SLOT(save()));
    }

  7. #7
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 11
    Par défaut
    Franchement tu est vraiment au top c'est super cool de ta part !!
    Je test ca et je te dis !!! MERCI MERCI MERCI deja

Discussions similaires

  1. Besoin d'aide pour une configuration
    Par mutekano dans le forum Architecture
    Réponses: 1
    Dernier message: 17/08/2016, 09h55
  2. Cherche solution pour une configuration MySQL
    Par saryry dans le forum Persistance des données
    Réponses: 0
    Dernier message: 05/11/2011, 09h59
  3. [PC fixe] Besoin de conseil pour une configuration !
    Par -YocK- dans le forum Ordinateurs
    Réponses: 1
    Dernier message: 02/06/2011, 00h09
  4. Configurer MYSQL++ avec Dev-C++ pour une connexion à BDMySQL
    Par limouna dans le forum Installation
    Réponses: 1
    Dernier message: 24/07/2005, 21h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo