Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de création de ToolBar

Sujet résolu
    19 octobre 2019 à 21:30:55

    Bonsoir à tous !

    J'ai un petit soucis avec ma QToolBar sur ma fenetre principale.

    Je souhaite initialiser ma fenetre avec la méthode suivante :

    void mainWindow::createToolBar()
    {
        QToolBar *toolBar = addToolBar("WorkShops");
        QWidget *toolBarMainWidget = new QWidget();
        QHBoxLayout *toolBarLayout = new QHBoxLayout();
        QToolButton *checkButton = new QToolButton();
        QToolButton *prepareButton = new QToolButton();
        QToolButton *simulateButton = new QToolButton();
        QToolButton *optimizeButton = new QToolButton();
        QToolButton *monitorButton = new QToolButton();
        checkButton->setText("Check");
        prepareButton->setText("Prepare");
        simulateButton->setText("Simulate");
        optimizeButton->setText("Optimize");
        monitorButton->setText("Monitor");
    
        checkButton->addAction(actionCheck);
        prepareButton->addAction(actionPrepare);
        simulateButton->addAction(actionSimulate);
        optimizeButton->addAction(actionOptimize);
        monitorButton->addAction(actionMonitor);
    
        toolBarLayout->addWidget(checkButton);
        toolBarLayout->addWidget(prepareButton);
        toolBarLayout->addWidget(simulateButton);
        toolBarLayout->addWidget(optimizeButton);
        toolBarLayout->addWidget(monitorButton);
    
        toolBarMainWidget->setLayout(toolBarLayout);
        toolBar->addWidget(toolBarMainWidget);
    
        toolBar->setStyleSheet("QToolButton {"
                               "    color: white;"
                               "    background-color: transparent;"
                               "    font: bold 18px;"
                               "    border: none;"
                               "    font-family: Helvetica;"
                               "}"
                               "QToolButton::pressed {"
                               "    color: white;"
                               "    background-color: #1D545C;"
                               "    border: none;"
                               "}");
    
        toolBar->setFixedHeight(80);
        toolBar->setMovable(false);
        toolBar->setFloatable(false);
    }


    Mais là plusieurs problèmes : 

    - Le programme crash au démarrage.

    - Si je retire les actions de mes boutons, le programme se lance bien mais le layout horizontal ne rempli pas toute la toolbar (c'était l'objectif).

    - La police Helvetica que j'ai défini ne s'applique pas, alors que la taille, la couleur et le type (gras) sont bien définis.

    Une autre question que je me posais, pourquoi suis-je obligé de créer un QWidget vide pour y inserer mon layout, ne puis-je pas directement appliquer le layout à la toolbar ?

    Cela fait plusieurs heures que je tourne en rond la dessus, si quelqu'un à une idée je suis preneur ! 

    Merci :)

    • Partager sur Facebook
    • Partager sur Twitter
      21 octobre 2019 à 23:50:06

      Bonjour,

      hugobike28 a écrit:

      - Le programme crash au démarrage.

      - Si je retire les actions de mes boutons, le programme se lance bien mais le layout horizontal ne rempli pas toute la toolbar (c'était l'objectif).

      As tu initialisé les actions avant de les ajouter aux boutons, donc avant d'appeler la fonction createToolBar

      Si les variables actionCheck, actionPrepare... ne pointent pas vers des objets valides, c'est normal que ça plante.

      - La police Helvetica que j'ai défini ne s'applique pas, alors que la taille, la couleur et le type (gras) sont bien définis.

      Essaye de mettre une autre police, et si ça fonctionne c'est que helvetica n'est pas disponible.

      Une autre question que je me posais, pourquoi suis-je obligé de créer un QWidget vide pour y inserer mon layout, ne puis-je pas directement appliquer le layout à la toolbar ?

      Tu n'es pas censé ajouter un layout à une QToolBar, même à l'aide d'un sous-widget, elle a déjà un layout. Les QToolButton sont également créés automatiquement si tu ajoutes directement les actions avec QToolBar::addAction, par exemple comme ceci (addAction permet également de créer les objets QAction en une seule ligne, plutôt que de les créer séparément):

      void MainWindow::createToolBar()
      {
          QToolBar *toolBar = addToolBar("WorkShops");
          actionCheck = toolBar->addAction(QIcon("check.ico"), "Check");
          actionPrepare = toolBar->addAction(QIcon("prepare.ico"), "Prepare");
          actionSimulate = toolBar->addAction(QIcon("simulate.ico"), "Simulate");
          actionOptimize = toolBar->addAction(QIcon("optimize.ico"), "Optimize");
          actionMonitor = toolBar->addAction(QIcon("monitor.ico"), "Monitor");
          toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
      
          toolBar->setStyleSheet("QToolButton {"
                                 "    color: black;"
                                 "    background-color: transparent;"
                                 "    font: bold 18px;"
                                 "    border: none;"
                                 "    font-family: 'Helvetica';"
                                 "}"
                                 "QToolButton::pressed {"
                                 "    color: white;"
                                 "    background-color: #1D545C;"
                                 "    border: none;"
                                 "}");
      
          toolBar->setFixedHeight(80);
          toolBar->setMovable(false);
          toolBar->setFloatable(false);
      }
      



      -
      Edité par alexisdm 21 octobre 2019 à 23:50:16

      • Partager sur Facebook
      • Partager sur Twitter
        22 octobre 2019 à 14:05:17

        Bonjour,

        merci pour ta réponse, en effet j'avais initialisé mes QAction dans une méthode séparée mais en fait j'avais rajouté QAction *action dans le cpp donc il ne la reconnaissait pas comme la Qaction que j'avais déclarée dans le header...

        Pour le layout ce qui m'embête en fait c'est que lorsque je place directement mes actions dans la toolbar, ils se se répartissent pas automatiquement sur toute la largeur de la toolbar. Ce que je voudrait c'est que la distance entre chaque action soit la même et qu'elle varie selon la taille de la fenetre pour être toujours réparties sur l'ensemble de la toolbar.

        Et pour les Pushbutton, est il possible d'ajouter directement un QMenu à la toolbar ? Je voudrait avoir un boutton avec un menu déroulant contenant des actions.

        Merci de ton aide !

        • Partager sur Facebook
        • Partager sur Twitter
          22 octobre 2019 à 18:59:08

          Tu peux insérer des widgets vides entre les actions qui vont s'étirer automatiquement:

          // Pour que la fenêtre soit assez large pour que tous les boutons s'affichent
          toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
          // On récupère toutes la liste des actions
          QList<QAction*> actions = toolBar->actions();
          // On insère un widget avant toutes les actions sauf la première, donc on retire le premier élément
          actions.removeFirst();
          for(QAction * action : actions) {
              QWidget* spacer = new QWidget();
              spacer->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred);
              toolBar->insertWidget(action, spacer);
          }
          

          Tu peux ajouter un menu à un QToolButton ou à un QAction, mais avec QAction, il faut quand même récupérer le QToolButton correspondant pour changer le mode d'apparition du menu, qui par défaut n'apparaît qu'au bout d'un léger délai.

              QMenu *menu = new QMenu();
              menu->addAction("menu1");
              menu->addAction("menu2");
          // Tu peux utiliser un des 2 blocs ci-dessous
          // - Creation d'une action pour y mettre le menu
              QAction menuAction = toolBar->addAction("Menu");
              toolBar->widgetForAction(menuAction)->setProperty("popupMode",QToolButton::InstantPopup);
              menuAction->setMenu(menu);
          
          // OU
          // - Creation d'un QToolButton
              QToolButton *menuButton = new QToolButton();
              menuButton->setText("Menu");
              toolBar->addWidget(menuButton);
              menuButton->setMenu(menu);
              menuButton->setPopupMode(QToolButton::InstantPopup);
          



          • Partager sur Facebook
          • Partager sur Twitter
            30 octobre 2019 à 19:18:32

            Salut,

            merci beaucoup ton aide, c'était effectivement ça ! :)

            Hugo

            • Partager sur Facebook
            • Partager sur Twitter

            Problème de création de ToolBar

            × 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