c++ et Qt

c++ et Qt - C++ - Programmation

Marsh Posté le 08-10-2005 à 10:53:24    

Salut,
voilà, j'ai un programme à faire en c++ qui utilisant une librairie graphique portable. J'ai donc choisit Qt. Je l'ai installé, ça a pris du temps mais ça marche, j'ai pu faire un "hello world" dans une fenetre graphique!
Mais je ne comprend pas tout :
 
1er point :
Dans mon repertoire projet, j'ai plusieurs classes dans des fichiers .cpp. Certaines utilisent des composants de Qt (pour le graphique) et d'autres non (classes "de bases" ).
-> Comment dois-je compiler les diférents classes!?
-Celles utilisant Qt avec "qmake"?
-Les classes de base avec gcc?
ou tout avec qmake?
 
2ème point (pour les utilisateurs mac)
Je souhaiterais développer mon projet avec xcode (qui supporte Qt).
Mais comment "ajouter" Qt à xcode? Comment faire que lorsque je fait un build, il soit capable de trouver les include correspondant à des fichiers de Qt?
 
Merci d'avance pour vos réponses

Reply

Marsh Posté le 08-10-2005 à 10:53:24   

Reply

Marsh Posté le 08-10-2005 à 11:14:56    

J'ai aps les fichiers sous les yeux là mais de tête, y a une option de qmake qui transforme ton projet QT en .xcode, ensuite tu n'as plus qu'a compiler depuis l'IDE.
 
Lundi, je te poste ca

Reply

Marsh Posté le 08-10-2005 à 12:38:25    

Ok je te remerci, j'attend ça.
 
Un projet fait avec xcode est un .xcode et avec Qt?
De plus, quel est la syntaxe exact de qmake, car dans un tuto on me dit de faire  
-qmake -project
-qmake
-make
Qu'est-ce que ces commandes font vraiment comparé à un make classique ou un g++ -o ...
 
Merci.

Reply

Marsh Posté le 08-10-2005 à 13:52:48    

qmake geenre un makefile compliqué qui prends tout en compte, il preprocess les ficheirs moc et ge ere les cpp de tes classes QT.
 
qmake a une option genre --macospbuilder qui au lieu de sortir un makefile sort un .xcode qui contient toute sles infos pour compiler proprement ton appli. Ensuit etu n'as plus qu'a taper ton code.

Reply

Marsh Posté le 09-10-2005 à 12:09:32    

Et est-il possible de compiler un .cpp contenant des "classes Qt" avec g++ (en lui précisant un path designant les .h Qt,...) ? Ou dois-je obligatoirement utiliser qmake?

Reply

Marsh Posté le 09-10-2005 à 13:32:32    

Non, tu n'es pas obligé, mais faut avoir une sacré bonne raison pour se passer de qmake :)
Edit: sans compter qu'il ne faut pas oublier de passer tes fichiers contenant des classes dérivées de QObject à la moulinette du moc et tes forms à celle d'uic.


Message édité par IrmatDen le 09-10-2005 à 13:33:37
Reply

Marsh Posté le 09-10-2005 à 14:01:30    

Par "tes forms à celle d'uic." tu entend quoi?
 
Merci

Reply

Marsh Posté le 09-10-2005 à 15:35:01    

Ce sont les formulaires/interfaces/widgets/... En gros tout ce que tu fais sous QtDesigner.
uic se charge de créer les fichiers .h nécessaire à leur compilation et intégration dans ton appli.
Et si tu utilises Qt4, il faut voir comment sont générées les ressources (images par exemples) pour le refaire dans ton propre Makefile.

Reply

Marsh Posté le 09-10-2005 à 18:06:47    

Tu connais un tuto qui explique un peu tout ça, j'en ai pas trouvé des bons.
 
Merci.

Reply

Marsh Posté le 09-10-2005 à 18:21:02    

A part à te coltiner les sources de qmake, je connais rien d'autre :/

Reply

Marsh Posté le 09-10-2005 à 18:21:02   

Reply

Marsh Posté le 09-10-2005 à 18:34:56    

Moi je fais ca :
 

Code :
  1. qmake -project


Dans mon rep. aevc tout mes sources, ca me creer un monProjet.pro
Ensuite :
 

Code :
  1. qmake -spec macx-xcode monProjet.pro


 
Qui me fais un .xcode pres a etre utilsier ;)
Je code tous ce dont j'ai besoin dans XCode et j'utilise le bouton compiler :p
 
Des que tu change tes .ui, regenre le .pro et le .xcode

Reply

Marsh Posté le 09-10-2005 à 21:47:34    

Je vous remercie, je vais essayer tout ça cette semaine!

Reply

Marsh Posté le 09-10-2005 à 22:32:52    

Tant que j'y suis :  
 
ya pas moyen de faire en sorte que lorsque je suis sur xcode et que je fait un "build", ça me compile mon projet contenant du c++ + qt (suite à une installation de qt pour xcode)?

Reply

Marsh Posté le 09-10-2005 à 23:01:45    

c'est le comportement de base de ce que je viens de te montrer :o

Reply

Marsh Posté le 09-10-2005 à 23:19:41    

ok je mélange un peu tout ce soir.
 
Merci Joel F.

Reply

Marsh Posté le 10-10-2005 à 22:37:39    

1) j'essaye à présent de générer le code source (.h et .cpp) à partir d'un .ui fait par QtDesigner :  
 
je fais d'abord  
-uic -o unt.h unt.ui (pour générer le .h)
 
ça marche mais pour générer le .cpp ça coince :  
-uic unt.ui -i unt.h -o unt.cpp
 
j'ai droit à cette réponse :  
 
Qt user interface compiler 4.0.1.
Usage: uic [OPTION]... <UIFILE>
 
  -h, -help                 display this help and exit
  -v, -version              display version
  -d, -dependencies         display the dependencies
  -o <file>                 place the output into <file>
  -tr <func>                use func() for i18n
  -p, -no-protection        disable header protection
 
comme si je n'utilisait pas la bonne syntaxe, pourtant dans les docs, c'est fait comme ça!
 
2) De plus, pour tracer des simple carrés, cercle, QtDesigner c'est bien adapté?
 
Merci!

Reply

Marsh Posté le 10-10-2005 à 23:28:31    

Autre chose :  
j'ai ce source tout simple, qui affiche une widget avec un bouton :  
 
 
-------------------
 
#include <qapplication.h>
#include <qpushbutton.h>
#include <qfont.h>
class MyWidget : public QWidget
{   public:
    MyWidget( QWidget *parent=0, const char *name=0 );   };
MyWidget::MyWidget( QWidget *parent, const char *name )
        : QWidget( parent, name )   {
    setMinimumSize( 200, 120 );
    setMaximumSize( 200, 120 );
    QPushButton *quit = new QPushButton( "Quit", this, "quit" );
    quit->setGeometry( 62, 40, 75, 30 );
//Géométrie du bouton définie dans la fenêtre suivant (x,y,w,h)
 
    quit->setFont( QFont( "Times", 18, QFont::Bold ) );
//définition de la police et taille du texte
    connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );    }
//Effectue la fonction quit en cliquant sur le bouton "quit".
int main( int argc, char **argv )
{   QApplication a( argc, argv );
    MyWidget w;
    w.setGeometry( 100, 100, 200, 120 );  
//Géométrie de la fenêtre définie dans l'écran suivant (x,y,w,h)
 
    a.setMainWidget( &w );
    w.show();
    return a.exec();
  }
 
-------------------
 
Quand je le compile sous visual c++ (avec qt 2.3.0) d'installé : pas de problème, ça marche.
 
Mais lorsque je suis sur mon mac (avec qt-mac-opensource-src-4.0.1 d'installée)  
je mets le même code code dans un fichier main.cpp, je tape
qmake -project
qmake
make
 
et là j'ai des erreurs du style : main.cpp:25: error: 'class QApplication' has no member named 'setMainWidget'
 
il s'agit pourtant de la même classe QApplication que sous windows non (vu que Qt est portable!?)
 
Qu'en pensez-vous?

Reply

Marsh Posté le 11-10-2005 à 10:27:18    

Sauf que c'est QT 2.3 dans un cas, et surement QT 4 dans l'autre.
http://doc.trolltech.com/4.0/porti [...] pplication
c'est devenu inutile.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-10-2005 à 13:39:07    

i'n'i a écrit :

1) j'essaye à présent de générer le code source (.h et .cpp) à partir d'un .ui fait par QtDesigner :  
 
je fais d'abord  
-uic -o unt.h unt.ui (pour générer le .h)
 
ça marche mais pour générer le .cpp ça coince :  
-uic unt.ui -i unt.h -o unt.cpp
 
j'ai droit à cette réponse :  
 
Qt user interface compiler 4.0.1.
Usage: uic [OPTION]... <UIFILE>
 
  -h, -help                 display this help and exit
  -v, -version              display version
  -d, -dependencies         display the dependencies
  -o <file>                 place the output into <file>
  -tr <func>                use func() for i18n
  -p, -no-protection        disable header protection
 
comme si je n'utilisait pas la bonne syntaxe, pourtant dans les docs, c'est fait comme ça!


D'après la doc:

Citation :

The uic reads an XML format user interface definition (.ui) file as generated by Qt Designer and creates a corresponding C++ header file.


Et si tu utilisais qmake, tu verrais qu'il ne génère qu'un en-tête par ui.
 

i'n'i a écrit :

2) De plus, pour tracer des simple carrés, cercle, QtDesigner c'est bien adapté?


Non, QtDesigner ne te permet pas de "dessiner" sur un widget. Ca, c'est à taper direct dans ton code.

Reply

Marsh Posté le 11-10-2005 à 13:57:10    

Donc à partir d'un .ui, comment fait-on pour avoir le .h(s) ET le(s) .cpp?
 
Pour mes cases et mes cercle, je les taperai dans le code alors.

Reply

Marsh Posté le 11-10-2005 à 16:33:11    

Il faut le compiler avec uic.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-10-2005 à 19:00:32    

uic ne génère qu'un en-tête.
Et cet en-tête contient aussi le code (à la façon d'un fichier Java).

Reply

Marsh Posté le 14-10-2005 à 14:18:49    

Juste 2 petites questions avec Qt :
 
-quel est le moyen le plus simple d'afficher une image (jpg par example) stocké sur mon disque dans une widget? Car il y a plusieurs classes qui traitent les photos (QLabel, QPicture, QImage, QPixmap) mais je ne sais pas lesquelles utiliser.
 
-comment diviser une widget en trois (3 rectangles de longueurs differents) par exemple : 1/4, 1/2, 1/4, car QGridLayout me fait une grille à dimension égales (1/4 1/4 1/4 1/4)  
 
Merci.

Reply

Marsh Posté le 14-10-2005 à 14:40:22    

cherche un peu dans les exemples et le qtAssistant et tu trouveras facilement. rien ne vaut une bonne doc.

Reply

Marsh Posté le 14-10-2005 à 21:32:37    

i'n'i a écrit :

-quel est le moyen le plus simple d'afficher une image (jpg par example) stocké sur mon disque dans une widget? Car il y a plusieurs classes qui traitent les photos (QLabel, QPicture, QImage, QPixmap) mais je ne sais pas lesquelles utiliser.


Tu as la réponse dans ta question. TU veux le mettre dans un widget? Regarde parmi les classes que tu as listé celles qui dérivent d'un QWidget.
 

i'n'i a écrit :

-comment diviser une widget en trois (3 rectangles de longueurs differents) par exemple : 1/4, 1/2, 1/4, car QGridLayout me fait une grille à dimension égales (1/4 1/4 1/4 1/4)


Solution: créer un QSpacerItem initialiser avec les bons paramètres ou encore créer des widgets invisibles.

Reply

Marsh Posté le 14-10-2005 à 22:22:09    

ok merci je vais essayer avec QSpacerItem.
 
Pour afficher les image j'ai trouver dans la doc un exemple qui en parle donc c'est bon.

Reply

Marsh Posté le 16-10-2005 à 23:43:05    

Je suis arrivé à afficher une image. Voici ma classe :  
/**************************************/
     class testImage : public QWidget
    {
    protected:
        void paintEvent(QPaintEvent *event);
         
    public:
        testImage();
    };
     
        testImage::testImage()
     : QWidget()
    {
     
 
    }
    void testImage::paintEvent(QPaintEvent * /* event */)
    {
        QPainter painter(this);
        QImage image(QString("/........../monImage.jpg" ));
        QLabel *imageLabel = new QLabel;
        imageLabel->setPixmap(QPixmap::fromImage(image));
        painter.drawPixmap(2, 2, *imageLabel->pixmap());
    }
/**************************************/
 
-mais je ne comprend pas comment fonctionne la fonction membre "testImage::paintEvent(QPaintEvent * /* event */)"
En effet, le main(), ni le contructeur de la classe ne fait appel à cette fonction! quand est-elle appelée alors, et puis-je faire sans (j'ai essayer, en vain).
-De plus je ne comprend pas le fonctionnement avec QPainter.
 
Si quelqu'un maitrise ceci ;)
d'avance merci.

Reply

Marsh Posté le 16-10-2005 à 23:46:24    

...et pourquoi suis-je passé par un Qlabel, je n'aurais pas pu créer un QPixmap tout simplement et le passer à         painter.drawPixmap(monPixmap)?
(si j'ai fait comme ça, c'est parceque j'ai repris un exemple de la doc en ligne de trolltech)
 
Merci.

Reply

Marsh Posté le 17-10-2005 à 12:01:46    

C'est Qt qui appelle paintEvent lorsque le widget doit être dessiné. QPainter c'est ce qui permet de dessiner.
QPainter( this ) => ce qui permet de dessiner sur this = le widget testImage.
Là, tu as donc créé un widget qui dessine une image.
Tu peux aussi passer par un QLabel qui sait dessiner une image. Ca peut te simplifie le code en t'évitant de créer ta propre classe.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-10-2005 à 12:58:32    

ok merci hello world!

Reply

Marsh Posté le 17-10-2005 à 19:36:40    

Quelqu'un sait comment tracer un cercle plein?
J'utilise drawEllipse() mais ça me trace des cercles vides.
 
Merci.

Reply

Marsh Posté le 17-10-2005 à 20:38:19    

Non c'est bon, j'ai trouvé, il faut faire un  setBrush(Qt::color);

Reply

Marsh Posté le 19-10-2005 à 19:50:15    

Salut,  
j'ai une classe qui fait un "plateau" de 4*4 myWidget :
 
     QGridLayout *grid = new QGridLayout();
        grid->setSpacing(1);
      for (int row = 0; row < 8; ++row)  
      {
             for (int column = 0; column < 8; ++column)  
             {
                 grid->addWidget(new myWidget, row, column);
             }
         }
     setLayout (grid);
 
Mais voilà :
- Comment acceder ensuite à une myWidget ? (par exemple celle qui est à la ligne 2, colonne 3).
- Si je fais un grid->addWidget(new myWidget, 2, 3); alors qu'il existe déjà une myWidget à cet emplacement, que devient l'ancienne? (dois-je faire un removeWidget avant?)
- si je fait un connect(this, SIGNAL(clicked()), qApp, SLOT(maFonction)); dans le constructeur de myWidget, est-ce que c'est correct (myFonction sera appelée en cliquant sur myWidget)?
 
Merci.

Reply

Marsh Posté le 19-10-2005 à 23:13:50    

Bien sur dans ma classe, remplacez 8 par 4 pour avoir un tableau de 4*4 myWidget ;)

Reply

Marsh Posté le 20-10-2005 à 19:04:57    

J'ai un autre petit problème :  
j'ai une classe case qui derive de QAbstractButton (pour la rendre cliquable). Je veux que lorsque je clique dessus elle change de couleur. Je fais donc  
 
ceci dans mon .h :
public slots:
       void ChangeColor();
 
ceci dans mon .cpp :
void Case:: ChangeColor(){
    setPalette(QPalette(QColor(40,121,17)));
    }
 
et dans mon main, lorsque je créer ma case :  
Case *maCase = new Case();
connect(maCase, SIGNAL(clicked()), ab, SLOT(Test()));
 
 
Mais voilà, ça ne marche pas!
Pourtant, lorsque je fait  
connect(ab, SIGNAL(clicked()), qApp, SLOT(quit()));
 
ça marche bien, ça me quitte bien l'application
 
Alors d'où ça vient?

Reply

Marsh Posté le 21-10-2005 à 09:47:22    

Citation :


public slots:  
       void ChangeColor();  
//...
connect(maCase, SIGNAL(clicked()), ab, SLOT(Test()));


là tu demandes d'appeler le slot Test(), qui n'existe pas...


Message édité par HelloWorld le 21-10-2005 à 09:47:37

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 21-10-2005 à 12:29:01    

ouais pardon, je fais bien SLOT(ChangeColor())); et ça ne marche pas qd-même

Reply

Marsh Posté le 21-10-2005 à 13:16:48    

Vérifie que ton slot est bien appelé, et fait un repaint().


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 21-10-2005 à 14:31:04    

En fait , c'est pas le changeColor() qui ne va pas, mon slot n'est pas apellé (pourtant il existe bien), par exemple, j'ai fait ceci :  
 
-dans mon case.h :  
public slots:  
       void Test();  
 
ceci dans mon case.cpp :  
void Case:: Test(){  
    setPalette(QPalette(QColor(0,128,0))); // pour la changer de couleur car avant elle avait une autre couleur
    }  
 
et dans mon main.cpp, lorsque je créer ma case :  
Case *maCase = new Case();  
connect(maCase, SIGNAL(clicked()), maCase, SLOT(Test()));  
 
et ça ne marche pas (je clique sur ma case, rien ne se passe)
 
Alors que lorsque je fais ça dans la main.cpp  
connect(maCase, SIGNAL(clicked()), qApp, SLOT(quit()));  
 
ça marche bien, ça me quitte bien l'application quand je clique sur ma case
 
Donc c'est qu'il ne passe pas dans ma fonction Test(), pourquoi??

Reply

Marsh Posté le 21-10-2005 à 14:35:53    

Si le connect échoue un message devrait être affiché par Qt dans la console. A priori, je dirais que tu as oublié de moc'er ta classe Case.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed