Table des matières
QT
http://doc.trolltech.com/4.6/examples.html
http://doc.trolltech.com/4.6/graphicsview.html
installeur pour mac: http://qt.nokia.com/downloads/sdk-mac-os-cpp
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