Cours 5 bis

2014-2015
Qt Creator
*
(Qt Designer)
*
de Qt Development Frameworks (anciennement Trolltech)
(http://qt.digia.com)
2I007 & LI357 / Université Paris VI
1
Choun Tong LIEU
2014-2015


Environnement multi-plateforme de développement intégré (IDE) (qtcreator)
contenant entre autre
• un éditeur de texte,
• deux éditeurs graphiques :
‑ Qt Designer pour construire les interfaces graphiques utilisateurs (UI) à
partir des widgets Qt,
‑ Qt Quick Designer pour développer avec le langage QML les UIs pour les
médias mobiles. Des UIs plus intuitifs, plus fluides, à partir des éléments
Qt (mobile sous Symbian et Maemo). Voir Qt SDK 1.1 ou Qt Quick.
Editeur de texte :
• vérification syntaxique,
• complétion,
• cacher ou non un bloc (contenu d'une classe, d'une procédure, etc, ...)
• aide contextuelle : par exemple, sur un mot
‑ en laissant la souris au dessus → bulle d'information (s'il y en a),
‑ cliquer avec le bouton de droite → menu pour poursuivre le mot,
‑ taper sur la touche « F1 » → documentation s'il y en a (par exemple si le
mot est une classe Qt),
‑ ...
2I007 & LI357 / Université Paris VI
2
Choun Tong LIEU
2014-2015
Fichier en cours d'édition
Menu déroulant pour sélectionner d'autres fichiers
2I007 & LI357 / Université Paris VI
3
Pour suivre et choisir les
symboles (procédures) de
la page
Choun Tong LIEU
2014-2015


Editeur d’interface graphique Qt Designer intégré dans Qt Creator
Vue groupée d’ensemble
2I007 & LI357 / Université Paris VI
4
Choun Tong LIEU
2014-2015




Ou éditeur d’interface graphique indépendant (designer-qt4).
Vue groupée
d’ensemble
Exécuter designer (ou designer-qt4) ou choisir dans le menu
<Fedora>  Programmation  Qt4 Designer
À la façon Visual Studio (Microsoft)
2I007 & LI357 / Université Paris VI
5
Choun Tong LIEU
2014-2015

Choix des différentes fenêtres avec vue éclatée « docked »

« docked » : (fenêtre ancrable par défaut) possibilité de déplacer les fenêtres
(souris enfoncée sur la barre de titre) à l’intérieur de la fenêtre principale.
La classe QDockWidget fournit des composantes qui peuvent être ancrées à
plusieurs dans un QMainWindow ou être au top-level.

2I007 & LI357 / Université Paris VI
6
Choun Tong LIEU
2014-2015

Ou vue éclatée de
l’ensemble
Signaux/slots
Barre
des
outils
Explorateur des
objets (instance
et classe)
Choix des
objets
prédéfinis
Propriétés de
l’objet sélectionné
2I007 & LI357 / Université Paris VI
7
Choun Tong LIEU
2014-2015




Plus puissant, mais moins d’outils d’aide au développement en version
gratuite que la précédente version Qt 3.
Pas mal de choses à faire à la main, mais quelques outils puissants sont
présents :
●
qmake-qt4 (pour faire le fichier projet .pro et le Makefile avec tous les
liens nécessaires).
●
uic (pour traduire un fichier XML contenant l’interface générée par
Designer en .h C++,
●
…,
En général, on choisit les objets proposés. On se contente de le modifier
pour l’adapter au besoin. Ils sont souvent composés et complexes.
On veut créer une application PlusMoins :
2I007 & LI357 / Université Paris VI
8
Choun Tong LIEU
2014-2015

Manipulations à faire : (par exemple)
●
Fichier  Nouveau... pour choisir une nouvelle forme d’objet
●
 Dialog without Buttons
pour choisir une forme de dialogue
●
 Créer
●
on ajoute ou retire les objets
Vertical Layout
●
on place un layout avant ou après avoir
mis ou non les pièces (ici QVBoxLayout),
●
on peut modifier l’aspect de ces objets
en modifiant leurs propriétés dans
la fenêtre Editeur de propriétés
●
on peut choisir notre propre classe
d’objets héritée des classes proposées
avec Promouvoir en....
Il faut pour cela, la présence des
fichiers .h et .cpp contenant la classe
de ces objets.
2I007 & LI357 / Université Paris VI
9
Choun Tong LIEU
2014-2015
●
on peut remplacer l'outil d'agencement (Layout) par un conteneur.
2I007 & LI357 / Université Paris VI
10
Choun Tong LIEU
2014-2015
●
●
●
●
●
●
●
la connexion signaux/slots peut être faite sans changer de classe.
mais en général, on veut définir nos propres signaux/slots pour une ou
des utilisations particulières (comme ici).
on enregistre la forme par Save Form As
 qmake-qt4 –project
pour générer un fichier .pro.
Il est important de laisser avant les fichiers .h et .cpp des classes
étrangères, car qmake-qt4 les intègre automatiquement au projet.
 qmake-qt4
pour le Makefile
 make ui_PlusMoins.h
(ce n’est pas nécessaire, car sera fait
automatiquement par make)
pour générer le ui_PlusMoins.h où l’on retrouve les instances des
objets utilisés (en C++) réunis dans une classe.
Il faut faire le lien avec une instance de cette classe et tout le nécessaire
pour donner vie à l’application.
2I007 & LI357 / Université Paris VI
11
Choun Tong LIEU
2014-2015
●
monbouton.h
#include <QApplication>
#include <QPushButton>
#include <iostream>
class MonBouton : public QPushButton
{
public :
MonBouton (QWidget *parent) : QPushButton(parent) {}
protected :
virtual void mouseReleaseEvent (QMouseEvent *e);
};
●
monbouton.cpp
#include "monbouton.h"
void MonBouton::mouseReleaseEvent (QMouseEvent *e)
{
QPushButton::mouseReleaseEvent(e);
std::cout << "Mon Bouton\n";
}
2I007 & LI357 / Université Paris VI
12
Choun Tong LIEU
2014-2015
●
ui_PlusMoins.h
#ifndef UI_PLUSMOINS_H
#define UI_PLUSMOINS_H
...
#include "monbouton.h"
class Ui_plusmoins
{
public:
QWidget *verticalLayout;
QVBoxLayout *vboxLayout;
MonBouton *plus;
QLineEdit *lineEdit;
MonBouton *moins;
void setupUi(QDialog *plusmoins)
{
plusmoins->setObjectName(QString::fromUtf8("plusmoins"));
...
plus = new MonBouton(verticalLayout);
plus->setObjectName(QString::fromUtf8("plus"));
...
lineEdit = new QLineEdit(verticalLayout);
2I007 & LI357 / Université Paris VI
13
Choun Tong LIEU
2014-2015
lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
...
moins = new MonBouton(verticalLayout);
moins->setObjectName(QString::fromUtf8("moins"));
vboxLayout->addWidget(moins);
retranslateUi(plusmoins);
QSize size(400, 300);
size = size.expandedTo(plusmoins->minimumSizeHint());
plusmoins->resize(size);
...
}
namespace Ui {
class plusmoins: public Ui_plusmoins {};
} // namespace Ui
#endif // UI_PLUSMOINS_H
2I007 & LI357 / Université Paris VI
14
Choun Tong LIEU
2014-2015
●
TP.h
#include "ui_PlusMoins.h"
class TP : public QDialog, public Ui::PlusMoins
{
Q_OBJECT
public:
TP(QWidget *parent = 0);
private slots:
void slotPlus();
void slotMoins();
};
2I007 & LI357 / Université Paris VI
15
Choun Tong LIEU
2014-2015
●
TP.cpp
#include
#include
#include
#include
#include
<QApplication>
"TP.h"
<iostream>
<QObject>
<QString>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
TP *tp = new TP(NULL);
tp->setupUi(tp);
tp->show();
QObject::connect(tp->plus, SIGNAL(clicked()),
tp, SLOT(slotPlus()));
QObject::connect(tp->moins, SIGNAL(clicked()),
tp, SLOT(slotMoins()));
return app.exec();
}
2I007 & LI357 / Université Paris VI
16
Choun Tong LIEU
2014-2015
TP::TP (QWidget *parent) : QDialog(parent)
{
}
void TP::slotPlus(void)
{
QString s = lineEdit->text();
int n
= s.toInt();
s.setNum(n + 1);
lineEdit->setText(s);
}
void TP::slotMoins(void)
{
QString s = lineEdit->text();
int n
= s.toInt();
s.setNum(n - 1);
lineEdit->setText(s);
}
2I007 & LI357 / Université Paris VI
17
Choun Tong LIEU
2014-2015

Il est possible de créer une classe de widget et de demander à Designer de
l’inclure parmi des widgets proposées. Dans l’exemple ci-dessous, on
trouve une nouvelle classe MonLineEdit.

Il faut que la classe soit présentée comme un plugin pour Designer.
Pour cela :
●
Créer une nouvelle classe (ici, MonLineEdit) héritée d’une des
classes de la famille des widgets en ajoutant les slots/signaux ou non.

2I007 & LI357 / Université Paris VI
18
Choun Tong LIEU
2014-2015
monlineedit.h
#include <qapplication.h>
#include <qlineedit.h>
#include <iostream.h>
monlineedit.cpp
#include "monlineedit.h"
class MonLineEdit : public QLineEdit
{
Q_OBJECT
public :
MonLineEdit (QWidget *parent) :
QLineEdit(parent) {}
private slots :
void slotPlus();
void slotMoins();
void
MonLineEdit::slotPlus (void)
{
QString s = text();
int n
= s.toInt();
s.setNum(n + 1);
setText(s);
}
};
void
MonLineEdit::slotMoins (void)
{
QString s = text();
int n
= s.toInt();
s.setNum(n - 1);
setText(s);
}
2I007 & LI357 / Université Paris VI
19
Choun Tong LIEU
2014-2015
●
Créer une classe (ici, MonLineEditPlugin) faisant l’interface entre
la classe MonLineEdit et Designer :
monlineeditplugin.h
#ifndef CUSTOMWIDGETPLUGIN_H
#define CUSTOMWIDGETPLUGIN_H
#include <QDesignerCustomWidgetInterface>
class MonLineEditPlugin : public QObject, public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
MonLineEditPlugin(QObject *parent = 0);
bool isContainer() const;
bool isInitialized() const;
QIcon icon() const;
QString domXml() const;
QString group() const;
QString includeFile() const;
QString name() const;
QString toolTip() const;
QString whatsThis() const;
QWidget *createWidget(QWidget *parent);
void initialize(QDesignerFormEditorInterface *core);
private:
bool initialized;
};
#endif
2I007 & LI357 / Université Paris VI
20
Choun Tong LIEU
2014-2015
monlineeditplugin.cpp
#include "monlineedit.h"
#include "monlineeditplugin.h"
#include <QtPlugin>
MonLineEditPlugin::MonLineEditPlugin(QObject *parent)
: QObject(parent)
{ initialized = false; }
void MonLineEditPlugin::initialize(QDesignerFormEditorInterface * /* core */)
{ if (initialized)
return;
initialized = true;
}
bool MonLineEditPlugin::isInitialized() const
{ return initialized; }
QWidget *MonLineEditPlugin::createWidget(QWidget *parent)
{ return new MonLineEdit(parent); }
QString MonLineEditPlugin::name() const
{ return "MonLineEdit"; }
2I007 & LI357 / Université Paris VI
21
Choun Tong LIEU
2014-2015
QString MonLineEditPlugin::group() const
{ return "Display Widgets [Examples]"; }
QIcon MonLineEditPlugin::icon() const
{ return QIcon(); }
QString MonLineEditPlugin::toolTip() const
{ return ""; }
QString MonLineEditPlugin::whatsThis() const
{ return ""; }
bool MonLineEditPlugin::isContainer() const
{ return false; }
QString MonLineEditPlugin::domXml() const
{
return "<widget class=\"MonLineEdit\" name=\"monLineEdit\">\n"
" <property name=\"geometry\">\n"
" <rect>\n"
"
<x>0</x>\n"
"
<y>0</y>\n"
"
<width>100</width>\n"
"
<height>100</height>\n"
" </rect>\n"
" </property>\n"
" <property name=\"toolTip\" >\n"
2I007 & LI357 / Université Paris VI
22
Choun Tong LIEU
2014-2015
" <string>Mon Line Edit</string>\n"
" </property>\n"
" <property name=\"Qu'est-ce-que c'est ?\" >\n"
" <string>Mon Line Edit.</string>\n"
" </property>\n"
"</widget>\n";
}
QString MonLineEditPlugin::includeFile() const
{ return "monlineedit.h"; }
Q_EXPORT_PLUGIN2(monlineeditplugin, MonLineEditPlugin)
●
●
Il faut ensuite à partir de ces fichiers générer un projet :
qmake-qt4 –project
 MonLineEdit.pro
Modifier ce fichier pour qu’un lib contenant la classe MonLineEdit
et son plugin MonLineEditPlugin soit créé pour Designer :
2I007 & LI357 / Université Paris VI
23
Choun Tong LIEU
2014-2015
TEMPLATE = lib
CONFIG += designer plugin debug_and_release
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
# Input
HEADERS += monlineedit.h monlineeditplugin.h
SOURCES += monlineedit.cpp monlineeditplugin.cpp
●
●
Exécuter ensuite qmake-qt4 pour créer le Makefile et ensuite
compiler avec make qui rend un lib (ici, libMonLineEdit.so)
prêt à s’intégrer dans les widgets de Designer.
Il suffit pour cela d’indiquer le chemin :
●
Créer un répertoire ..../plugins/designer et y mettre le
fichier libMonLineEdit.so.
●
Faire un export QT_PLUGIN_PATH=…./plugins
●
Lancer designer-qt4.
2I007 & LI357 / Université Paris VI
24
Choun Tong LIEU