Partage
  • Partager sur Facebook
  • Partager sur Twitter

conseils pour un projet avec Qt

C++ et Qt

    20 mai 2019 à 3:18:19

    Bonjour

    j'ai une idée de projet en Qt et j'ai besoin de quelques conseils pour m'aider.

    Je précise que je souhaite le faire moi-même, pas obtenir toutes les réponses toutes faites.

    1) J'aurai notamment une QProgressBar à défaut de faire mieux, et je voudrais qu'elle avance par exemple durant 20 secondes et durant 20 secondes dans l'autre sens et que une betite boule par exemple se déplace, et fasse le va et bien pendant un temps déterminé par moi-même au départ.

    Est-ce que c'est faisable avec QProgressBar ? ou peut-être avez-vous mieux qu'une QProgressBar ?

    2) J'avais pensé à Qt Designer sous Qt Creator. Cependant, étant donné que le truc est un peu sophistiqué, je ne sais pas si on peut le faire en Qt Designer sans modifier manuellement le code, ce qui est une très mauvaise pratique. 

    3) De plus, je voudrais qu'un son créé par moi-même en mp3 que j'enregistre, soit émis à chaque fois que la progresse bar arrive au bout des 20 secondes

    4) Comment intégrer un fichier son de ce type avec Qt ?

    5) Avez-vous des conseils pour rendre la chose esthétique ?

    Il ya probablement d'autres conseils que vous pourriez prodiguer afin de partir sur de bonnes bases. Bienvenus !

    Par avance merci pour vos aides pour commencer

    -
    Edité par pseudo-simple 20 mai 2019 à 3:27:30

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2019 à 11:04:02

      1) Je pencherai sur un QTimer qui change la valeur de la progresse bar à intervalles réguliers.

      2) Avec Qt Designer on peut pratiquement tout faire, même rajouter des widgets faits maison. Personnellement quand je fais du Qt, j'utilise toujours Qt Designer.

      Pour le reste je laisses d'autres répondrent.

      • Partager sur Facebook
      • Partager sur Twitter

      git is great because Linus did it, mercurial is better because he didn't.

        20 mai 2019 à 13:29:51

        Bonjour Markand

        en attendant d'autres réponses, est-ce que tout ce que je veux faire est possible avec Qt Designer ?

        Par exemple pour le son ?

        POur la boule qui monte et descend sur 20 secondes, je voudrais que ça se fasse de manière continue à l'oeil, c'est-à-dire que l'on ne devrait pas voir de mouvement saccadé de la progression, mais un mouvement fluide continu et régulier.

        En te remerciant par avance

        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2019 à 14:24:46

          Pour le son faut regarder du côté de Qt multimédia. Doit y avoir une classe QSound ou QMedia pour le jouer.

          Par contre ça ne sera pas via le designer, qui est fait pour les interfaces graphiques uniquement.

          • Partager sur Facebook
          • Partager sur Twitter
            20 mai 2019 à 21:40:30

            Bonsoir,

            dans ce cas , si j'ai une partie en Qt Designer et une autre qui n'est pas en Designer, un jour gbdivers m'avait dit qu'il ne fallait pas toucher manuellement au fichier généré automatiquement par la manipulation en Qt Designer

            Est-ce que l'on peut proprement faire une partie en QT designer et ajouter une partie manuellement , en créant un code de qualité ?

            Si oui, que conseillez-vous ?

            Merci par avance

            -
            Edité par pseudo-simple 20 mai 2019 à 21:54:39

            • Partager sur Facebook
            • Partager sur Twitter
              21 mai 2019 à 8:55:06

              T'es obligé de coupler les deux. Qt designer ne fait que te générer un fichier C++ pour construire ton interface. C'est celui là qu'il ne faut pas toucher à la main. Par contre tout seul il ne va pas lancer ton application, tu dois ajouter le lancement + tout le métier.
              • Partager sur Facebook
              • Partager sur Twitter
                21 mai 2019 à 11:21:05

                Bonjour,

                alors j'ai commencé, j'ai un peu avancé. Par contre, j'ai une problématique :

                je souhaite m'entraîner à utiliser des unique_ptr avec Qt

                je ne sais pas encore si c'esg une bonne idée.

                J'ai un message d'erreur qui me dit que l'on ne peut "caster" un std::unique_ptr<QTimer> en const QObject*

                timer = std::make_unique<QTimer>(this);
                connect(static_cast<const QObject*>(timer),SIGNAL(timeout()), this, SLOT(oneGoAndBack()));

                J'ai essayé avec différentes formes de cast

                Quelle est l'idée pour résoudre ce problème ?

                Merci

                • Partager sur Facebook
                • Partager sur Twitter
                  21 mai 2019 à 11:34:06

                  En general on evite d'utiliser les smart_ptr avec tout ce qui derive de QObject. Etant donnée que Qt libere les toutes les ressources via un systeme parent-efant, il risque d'y avoir une double liberation, donc un crash.

                  Pour ton problème, pourquoi tu veux caster? De plus tu devrais utiliser la nouvelle syntaxe signal/slot de Qt. 

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Eug

                    21 mai 2019 à 12:08:59

                    je veux caster car à la compilation, le message d'erreur dit :

                    pas possible de convertir un std::unique_ptr<QTimer> en const QObject*

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 mai 2019 à 13:40:46

                      Voici ce que j'ai trouvé pour la nouvelle syntaxe pour les signals & slots

                      https://doc.qt.io/qt-5/signalsandslots.html

                      Quelle est en l'avantage ?

                      cela n'a pas l'air fondamentalement différent de l'ancienne syntaxe pourtant

                      EDIT : voici ce que j'ai fait et ça ne compile pas , le message renvoyé parle de fonction statiques ...

                      connect(timer.get(),&QTimer::timeout(), this, &this->oneGoAndBack());

                      POurriez-vous m'expliquer le problème dans l'utilisation de la nouvelle syntaxe ?

                      Merci

                      -
                      Edité par pseudo-simple 21 mai 2019 à 13:50:27

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 mai 2019 à 14:16:35

                        Relis correctement, là tu appelle une fonction alors qu'on parle de passer la fonction en paramètre.

                        Ainsi:

                        connect(timer.get(), &QTimer::timeout, this, &NomDeCetteClasseThis::oneGoAndBack);



                        • Partager sur Facebook
                        • Partager sur Twitter

                        git is great because Linus did it, mercurial is better because he didn't.

                          21 mai 2019 à 17:01:40

                          Salut,

                          J'appuie ce que disent mes VDDs :

                           - QtDesigner te permet de construire ton interface, même avec des objets personnalisés, et il est normal de manipuler cette interface dans la classe utilisatrice ne serait-ce pour la lier aux traitements qui vont avec. Ce que tu ne dois pas modifier, c'est le code généré par le moc

                           - Pour jouer des sons, tu as tout la partie audio du framework QtMultimedia

                           - Laisse Qt gérer les objets avec le système parent-enfant quand tu le peux

                           - utilise la syntaxe Qt5 des connect

                          et voulais compléter en donnant une piste pour l’esthétique :

                           - le qml permet de décrire des interfaces personnalisées et animées bien plus facilement

                           - si tu souhaites continuer avec les widgets, la personnalisation se fait à l'aide des classes de style et les stylesheet (semblable au CSS)

                              PS : Et tu peux animer ton objet en widget faisant des aller-retours avec le framework d'animation

                          -
                          Edité par romantik 21 mai 2019 à 17:10:52

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Dream on, Dream on, Dream until your dream comes true
                            21 mai 2019 à 22:24:43

                            bonsoir à vous tous,

                            cela m'aide beaucoup.

                            j'ai continué d'avancer.

                            Par contre, à un point, ça ne passe pas :

                            MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
                            {
                            
                                QMediaPlayer *player=new QMediaPlayer;
                                player->setMedia(QUrl::fromLocalFile("musique.mp3"));
                                player->setVolume(100);
                                player->play();

                            Pourtant, quand j'exécute le code, la musique ne se joue pas.

                            Je l'ai ajoutée dans les "others files" dans l'arborescence de Qt creator pourtant.

                            Je suppute que cela vienne du chemin, car c'est le seul point de doute, et encore, ça me semble correct

                            J'ai fait qmake après avoir fait QT += multimedia

                            EDIT :En fait, j'ai un doute sur où je dois placer le fichier mp3 et quel chemin je dois donner

                            -
                            Edité par pseudo-simple 21 mai 2019 à 22:41:53

                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 mai 2019 à 23:53:20

                              Ton fichier .mp3 doit etre dans le même repertoire que ton projet. C-a-d dans le même dossier où tu as ton fichier main et les autres...

                              sinon, il y'a Qt resource

                              Si tu veux profiter du systeme parent/enfant de Qt, il faut passer "this" en parametre à la ligne 4.

                              -
                              Edité par eugchriss 21 mai 2019 à 23:55:43

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Eug

                                22 mai 2019 à 0:01:47

                                J'ai fait ce que tu dis, et la musique ne se lance pas encore pour l'instant :

                                fichiers mp3 comme tu dis, ajout de this

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  22 mai 2019 à 9:49:44

                                  Il faut que la musique soit dans le même répertoire que ton exécutable (donc quelque part dans le dossier build-xxx), ou que ton chemin soit absolu ou relatif à ce dossier.

                                  Mais sinon, je te conseille d'utiliser un fichier qrc, ça sera beaucoup plus simple.

                                  EDIT: Après si c'est juste un petit son tu as une classe faite pour ça beaucoup plus simple que celle pour une musique : https://doc.qt.io/qt-5/qsound.html

                                  QSound::play("mysounds/bells.wav");

                                  -
                                  Edité par Maluna34 22 mai 2019 à 10:10:58

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    22 mai 2019 à 11:55:03

                                    J'avance.

                                    Pour débuter , un grand merci à Maluna34, eugchriss, romantik, markand.

                                    Alors avec QMediaPlayer, et QSound, j'arrive à lancer un fichier wav.

                                    Par contre, quand je passe sur un mp3 en changeant simplement cela, cela ne fonctionne plus.

                                    Le wav passe, pas le mp3

                                    Auriez-vous une idée comment remédier à cela ?

                                    Merci

                                    EDIT : un autre pseudo-problème : sur un autre point concernant les QTimer, j'ai pu déboguer un truc par hasard, mais j'aimerais le comprendre : j'avais deux QTimer dans la même fonction donc UN SEUL était une variable membre de ma classe et le programme se lançait, mais ce que je voulais voir à l'écran ne se passait pas. Lorsque j'ai passé le deuxième QTimer en variable membre pour déboguer dans l'objectif de respecter SOLID, le  problème s'est réglé. Cependant, je n'ai pas compris pourquoi.

                                    -
                                    Edité par pseudo-simple 22 mai 2019 à 19:41:56

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      23 mai 2019 à 17:09:40

                                      QSound ne prend effectivement en charge que les fichier wav, c'est ce qui est écrit dans sa documentation. Parce que c'est un format brut, QSound n'a ainsi pas à gérer l'encodage et la compression du son.

                                      On comprend rien à ce que tu raconte avec tes QTimer, soit plus clair s'il te plait, et avec un code example pour illustrer

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Dream on, Dream on, Dream until your dream comes true
                                        24 mai 2019 à 15:20:58

                                        Pour le mp3 (sans les resources), j'ai fait ce qui est indiqué ici :

                                        https://doc.qt.io/qt-5/audiooverview.html

                                        et cela n'a pas fonctionné.

                                        Peux-tu m'expliquer comment pouvoir le jouer sur mon projet sans les ressources ?

                                        Je l'ai aussi essayé avec les qrc ressources et cela n'a pas marché.

                                        J'ai fait :

                                        player->setMedia(QUrl("qrc:/ressources/file.mp3"));
                                        
                                            player->setVolume(100);
                                             player->play();

                                        J'ai essayé :

                                        player->setMedia(QUrl::fromLocalFile("qrc:/ressources/file.mp3"));

                                        et d'autres combinaisons possibles


                                        Merci

                                        -
                                        Edité par pseudo-simple 24 mai 2019 à 22:03:56

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        conseils pour un projet avec Qt

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown