Outils pour utilisateurs

Outils du site


qt

QT

Compilation projet QT avec Open CV

à l'execution depuis l'ide QTcreator, erreur:“Cannot connect creator comm socket stub-socket: No such file or directory”

pour y remedier: Menu | Tools | Options | Environment | General | System | Terminal → xterm -e

messagebox

#include <qmessagebox.h>
QMessageBox::information( this, "Application name",
                              "blabla.\n"
                              "blibli." );

Ébauche fenêtre graphique sous QT

ébauche du GUI fenPrincipale.cpp fenPrincipale.h main.cpp

Feuille d'ébauche de la fenêtre graphique

Astuce et bouts de codes pour dév GUI sous Qt

Lien d'un tuto tres bien réalisé : http://www.siteduzero.com/tutoriel-3-11240-introduction-a-qt.html

Fichier comprenant l'essentiel de ce tuto et astuce pour développer en Qt (à enrichir MAJ 12/02/2010) http://eminencess.free.fr/MOSAIC/Qt.cpp

CREATION ET DEFINITION DUN BOUTON

  // Création de l'application
  QApplication app(argc, argv);
  // Création d'un widget qui servira de fenêtre
  QWidget fenetre;
  // Definition de la taille de la fenetre
  fenetre.setFixedSize(300, 150);
  // Création d'un bouton
  QPushButton bouton("Pimp mon bouton !", &fenetre);
  // Modification de la police, pour cela on crée d'abord un objet qui définit la police (Qfont)
  // 1: nom de la police;  2: Taille; 3:epaisseur ; 4: italic
  QFont Police_comic("Comic Sans MS", 10, QFont::Bold, true);
  // Modification du texte avec un accesseur;  attente de la fonction : Qstring
  bouton.setText("Pimp mon bouton !");
  // Ajout d'une infobulle;  attente de la fonction : Qstring
  bouton.setToolTip("Texte d'aide");
  // Modification de la police  font
  bouton.setFont(Police_comic);
  // Modification du curseur sur le bouton
  bouton.setCursor(Qt::PointingHandCursor);
  //Permet de lire les icones présente dans le dossier de l'exécutable de l'application
  QIcon(QCoreApplication::applicationDirPath() + "/smile.jpg");
  // Ajouter une icone au bouton, smile.png doit se trouver dans le repertoire home de linux
  bouton.setIcon(QIcon("smile.png"));
  // Déplace le bouton ou l'on veut
  bouton.move(60, 50);
  // bouton.setGeometry(abscisse, ordonnee, largeur, hauteur);
  bouton.setGeometry(60  , 50, 200, 40);
  // Création d'un autre bouton ayant pour parent le premier bouton
   QPushButton autreBouton("Autre bouton", &bouton);
   autreBouton.move(30, 15);
  // Permet d'afficher la fenetre
  fenetre.show();

CREATION D UN SIDE BAR ET LCD avec connexion

  m_lcd = new QLCDNumber(this);
  m_lcd->setSegmentStyle(QLCDNumber::Flat);
  m_lcd->move(50, 20);
  m_slider = new QSlider(Qt::Horizontal, this);
  m_slider->setRange(200, 600);
  m_slider->setGeometry(10, 60, 150, 20);
  QObject::connect(m_slider, SIGNAL(valueChanged(int)), m_lcd, SLOT(display(int)));

progress bar

  m_progress = new QProgressBar(this);
  m_progress->setGeometry(10, 100, 150 ,30 );
  m_progress->setRange(200, 600);

CREER UN OBJET FENETRE

  HEADER FILE :
  
  
  #ifndef MAFENETRE_H
  #define MAFENETRE_H
  
  #include <QApplication>
  #include <QWidget>
  #include <QPushButton>
  
  class MaFenetre : public QWidget // On hérite de QWidget (IMPORTANT)
  {
      public:
      MaFenetre();
   
      private:
      QPushButton *m_bouton; 
  };
  
  
  #endif // MAFENETRE_H

CPP FILE :

  #include "MaFenetre.h"
   
  MaFenetre::MaFenetre() : QWidget()
  {
      setFixedSize(300, 150);
   
      // Construction du bouton
      m_bouton = new QPushButton("Pimp mon bouton !", this);
   
      m_bouton->setFont(QFont("Comic Sans MS", 14));
      m_bouton->setCursor(Qt::PointingHandCursor);
      m_bouton->setIcon(QIcon("smiley.png"));
      m_bouton->move(60, 50);
  }
  

CREER SES PROPRES SLOTS

Pour cela il faut rajouter Q_OBJECT dans la définition du header de la fenetre, ce cette facon on peu rajouter une section public_slots: /!\ Il faut effectuer un qmake pour que le slot soit pris en compte ! !

exemple :

  class MaFenetre : public QWidget
  {
      Q_OBJECT
  
      public:
      MaFenetre();
  
      public slots:
      void changerLargeur(int largeur);
  
      private:
      QSlider *m_slider;
  };

On déclare la fonction associé dans le cpp :

  void MaFenetre::changerLargeur(int largeur)
  {
      setFixedSize(largeur, 300);
  }

CREE SES PROPRES SIGNAUX

Egalement Q_OBJET dans le header Et ajout d'une catégorie

  signals:
      void agrandissementMax();

emission du signal :

  if (largeur == 600)
      {
          emit agrandissementMax();
      }

connexion de ce signal :

  QObject::connect(this, SIGNAL(agrandissementMax()), qApp, SLOT(quit()));

AFFICHER UN MESSAGE EN POP UP

On utilise des méthodes statiques (pas besoin de créer des objets pour utiliser ces méthodes Utilisation des standard box :

  StandardButton information ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton );

parent : un pointeur vers la fenêtre parente (qui doit être de type QWidget ou hériter de QWidget). Vous pouvez envoyer NULL en paramètre si vous ne voulez pas que votre boîte de dialogue ait une fenêtre parente, mais ce sera plutôt rare.

title : le titre de la boîte de dialogue (affiché en haut de la fenêtre).

text : le texte affiché au sein de la boîte de dialogue.

Exemple

  QMessageBox::information(this, "Titre de la fenêtre", "Bonjour et bienvenue à tous les Zéros !");
  QMessageBox::warning(this, "Titre de la fenêtre", "Attention, vous êtes peut-être un Zéro !");
  QMessageBox::critical(this, "Titre de la fenêtre", "Vous n'êtes pas un Zéro, sortez d'ici ou j'appelle la police !");
  QMessageBox::question(this, "Titre de la fenêtre", "Dites voir, je me posais la question comme ça, êtes-vous vraiment un Zéro ?");

Personnalisation des boutons dans ces boites de dialogue:

  QMessageBox::question(this, "Titre de la fenêtre", "Dites voir, je me posais la question comme ça, êtes-vous vraiment un Zéro ?", QMessageBox::Yes | QMessageBox::No);

Récupération de la valeur cliqué :

  int reponse = QMessageBox::question(this, "Interrogatoire", "Dites voir, je me posais la question comme ça, êtes-vous vraiment un Zéro ?", QMessageBox::Yes | QMessageBox::No);
      if (reponse == QMessageBox::Yes)
      {
          QMessageBox::information(this, "Interrogatoire", "Alors bienvenue chez les Zéros !");
      }
      else if (reponse == QMessageBox::No)
      {
          QMessageBox::critical(this, "Interrogatoire", "Tricheur ! Menteur ! Voleur ! Ingrat ! Lâche ! Traître !\nSors d'ici ou j'appelle la police !");
      }

Fenêtre de saisie :

GET TEXT

  QString QInputDialog::getText ( QWidget * parent, const QString & title, const QString & label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), bool * ok = 0, Qt::WindowFlags f = 0 );
  • parent : pointeur vers la fenêtre parente. Peut être mis à NULL pour ne pas indiquer de fenêtre parente.
  • title : titre de la fenêtre affiché en haut.
  • label : texte affiché dans la fenêtre.
  • mode : mode d'édition du texte. Permet de dire si on veut que les lettres s'affichent quand on tape, ou si elles doivent être remplacées par des astérisques (pour les mots de passe) ou si aucune lettre ne doit s'afficher. Toutes les options sont dans la doc. Par défaut, les lettres s'affichent normalement (QLineEdit::Normal).
  • text : le texte par défaut dans la zone de saisie.
  • ok : un pointeur vers un booléen pour que Qt puisse vous dire si l'utilisateur a cliqué sur OK ou sur Annuler.
  • f = quelques flags (options) permettant d'indiquer si la fenêtre est modale (bloquante) ou pas. Les valeurs possibles sont détaillées par la doc.
  QString pseudo = QInputDialog::getText(this, "Pseudo", "Quel est votre pseudo ?");

Récupérer le bouton cliqué :

  bool ok = false;
  QString pseudo = QInputDialog::getText(this, "Pseudo", "Quel est votre pseudo ?", QLineEdit::Normal, QString(), &ok);
  
  if (ok && !pseudo.isEmpty())
  {
      QMessageBox::information(this, "Pseudo", "Bonjour " + pseudo + ", ça va ?");
  }
  else
  {
      QMessageBox::critical(this, "Pseudo", "Vous n'avez pas voulu donner votre nom... snif.");
  }

GET INTEGER

  int QInputDialog::getInteger ( QWidget * parent, const QString & title, const QString & label, int value = 0, int minValue = -2147483647, int maxValue = 2147483647, int step = 1, bool * ok = 0, Qt::WindowFlags f = 0 );

exemple :

  int entier = QInputDialog::getInteger(this, "Nombre", "Entrez un nombre entier");

GET DECIMAL

  double QInputDialog::getDouble ( QWidget * parent, const QString & title, const QString & label, double value = 0, double minValue = -2147483647, double maxValue = 2147483647, int decimals = 1, bool * ok = 0, Qt::WindowFlags f = 0 );

exemple :

  double nombreDecimal = QInputDialog::getDouble(this, "Nombre", "Entrez un nombre décimal");

GET LIST

  QString QInputDialog::getItem ( QWidget * parent, const QString & title, const QString & label, const QStringList & list, int current = 0, bool editable = true, bool * ok = 0, Qt::WindowFlags f = 0 );
  • list : la liste des choix possibles, envoyée via un objet de type QStringList (liste de chaînes) à construire au préalable.
  • current : le numéro du choix qui doit être sélectionné par défaut.
  • editable : un booléen qui indique si l'utilisateur a le droit d'entrer sa propre réponse (comme avec getText) ou s'il est obligé de faire un choix parmi la liste.

Définition de la liste il ne faut pas oublier d'inclure QStringList :

  QStringList pays;
  pays << "France" << "Belgique" << "Suisse" << "Canada (québec)" << "Maroc" << "Autre";
  QInputDialog::getItem(this, "Votre pays", "De quel pays es-tu, cher Zéro ?", pays);

Fenêtre pour choisir la police

  QFont getFont ( bool * ok, const QFont & initial, QWidget * parent, const QString & caption )

On retrouve notre pointeur vers un booléen “ok” qui permet de savoir si l'utilisateur a cliqué sur OK ou a annulé. On peut spécifier une police par défaut (initial), il faudra envoyer un objet de type QFont. Voilà justement que la classe QFont réapparaît :) Enfin, la chaîne caption correspond au message qui sera affiché en haut de la fenêtre.

exemple :

  QFont police = QFontDialog::getFont(&ok, m_boutonDialogue->font(), this, "Choisissez une police");

Fenêtre pour choisir une couleur

  QColor QColorDialog::getColor ( const QColor & initial = Qt::white, QWidget * parent = 0 );

Le code suivant ouvre une boîte de dialogue de sélection de couleur, puis crée une palette dont la couleur du texte correspond à la couleur qu'on vient de sélectionner, et applique enfin cette palette au bouton :

  QColor couleur = QColorDialog::getColor(Qt::white, this);
  QPalette palette;
  palette.setColor(QPalette::ButtonText, couleur);
  m_boutonDialogue->setPalette(palette);

Fenêtre pour sélectionner un dossier

  QString dossier = QFileDialog::getExistingDirectory(this);

Fenêtre pour sélectionner un fichier ou plusieurs

  QString fichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Images (*.png *.gif *.jpg *.jpeg)");

On peut également utlisé getOpenFileNames qui sélectionne plusieurs fichiers et les stocke dans un QStringList

Positionnement relatif par layout Horizontal ou vertical

Classe gérant les layouts :

   QBoxLayout
   QHBoxLayout
   QVBoxLayout
   QGridLayout
   QFormLayout
   QStackedLayout

L'utilisation d'un layout se fait en 3 temps :

  1. On crée les widgets
  2. On crée le layout et on place les widgets dedans
  3. On dit à la fenêtre d'utiliser le layout qu'on a créé

Création d'un layout horizontal :

  QHBoxLayout *layout = new QHBoxLayout;

On ajoute les widget dans le layout de cette façon :

  layout->addWidget(bouton1); //addWiget attends un pointeur comme paramètre
  layout->addWidget(bouton2);
  layout->addWidget(bouton3);

Associer le layout à la fenêtre :

  fenetre.setLayout(layout);

De cette façon les boutons ne sont pas fixes et s'adapte a la taille de la fenêtre

Meme chose pour du vertical on utilise QVBoxLayout

Positionnement relatif par layout grid

On ajoute 2 parametres qui représenta la grille :

     0,0  0,1  0,2  0,3  0,4
     1,0  1,1  1,2  1,3  1,4
     2,0  2,1  2,2  2,3  2,4

QGridLayout *layout = new QGridLayout;

  layout->addWidget(bouton1, 0, 0);
  layout->addWidget(bouton2, 0, 1);
  layout->addWidget(bouton3, 1, 0);
  fenetre.setLayout(layout);
  On peut également utliser plus d'espace pour un seul widget :
          layout->addWidget(bouton3, 1, 0, 1, 2); // on ajout 2 parametres qui définisse la largueur en case du widget et la hauteur.

Layout formulaire

Utilisation de la class QFormLayout QlineEdit Zone de texte sur une ligne

 QLineEdit *nom = new QLineEdit;
 QLineEdit *prenom = new QLineEdit;
 QLineEdit *age = new QLineEdit;
 QFormLayout *layout = new QFormLayout;
 layout->addRow("Votre nom", nom);
 layout->addRow("Votre prénom", prenom);
 layout->addRow("Votre âge", age);
 fenetre.setLayout(layout);

Combiner les layouts

on utilise addLayout au lieu de addWidget pour permettre d intégrer des layout dans des layout layoutPrincipal→addLayout(formLayout); Ajout du layout de formulaire =====error ptrace===== en cas de probleme pour debugger sous linux: http://www.deder.at/wordpress/?p=307 sudo gedit /etc/sysctl.d/10-ptrace.conf and set kernel.yama.ptrace_scope = 0 reboot

qt.txt · Dernière modification: 2014/06/09 19:03 par bvandepo