Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3137 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  c++ et Qt

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

c++ et Qt

n°1218213
i'n'i
Posté le 08-10-2005 à 10:53:24  profilanswer
 

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

mood
Publicité
Posté le 08-10-2005 à 10:53:24  profilanswer
 

n°1218228
Joel F
Real men use unique_ptr
Posté le 08-10-2005 à 11:14:56  profilanswer
 

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

n°1218256
i'n'i
Posté le 08-10-2005 à 12:38:25  profilanswer
 

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.

n°1218276
Joel F
Real men use unique_ptr
Posté le 08-10-2005 à 13:52:48  profilanswer
 

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.

n°1218651
i'n'i
Posté le 09-10-2005 à 12:09:32  profilanswer
 

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?

n°1218687
IrmatDen
Posté le 09-10-2005 à 13:32:32  profilanswer
 

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
n°1218704
i'n'i
Posté le 09-10-2005 à 14:01:30  profilanswer
 

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

n°1218791
IrmatDen
Posté le 09-10-2005 à 15:35:01  profilanswer
 

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.

n°1218946
i'n'i
Posté le 09-10-2005 à 18:06:47  profilanswer
 

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

n°1218958
IrmatDen
Posté le 09-10-2005 à 18:21:02  profilanswer
 

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

mood
Publicité
Posté le 09-10-2005 à 18:21:02  profilanswer
 

n°1218965
Joel F
Real men use unique_ptr
Posté le 09-10-2005 à 18:34:56  profilanswer
 

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

n°1219060
i'n'i
Posté le 09-10-2005 à 21:47:34  profilanswer
 

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

n°1219085
i'n'i
Posté le 09-10-2005 à 22:32:52  profilanswer
 

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)?

n°1219107
Joel F
Real men use unique_ptr
Posté le 09-10-2005 à 23:01:45  profilanswer
 

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

n°1219121
i'n'i
Posté le 09-10-2005 à 23:19:41  profilanswer
 

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

n°1220038
i'n'i
Posté le 10-10-2005 à 22:37:39  profilanswer
 

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!

n°1220094
i'n'i
Posté le 10-10-2005 à 23:28:31  profilanswer
 

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?

n°1220201
HelloWorld
Salut tout le monde!
Posté le 11-10-2005 à 10:27:18  profilanswer
 

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
n°1220356
IrmatDen
Posté le 11-10-2005 à 13:39:07  profilanswer
 

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.

n°1220367
i'n'i
Posté le 11-10-2005 à 13:57:10  profilanswer
 

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.

n°1220543
HelloWorld
Salut tout le monde!
Posté le 11-10-2005 à 16:33:11  profilanswer
 

Il faut le compiler avec uic.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1220674
IrmatDen
Posté le 11-10-2005 à 19:00:32  profilanswer
 

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).

n°1223146
i'n'i
Posté le 14-10-2005 à 14:18:49  profilanswer
 

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.

n°1223164
Profil sup​primé
Posté le 14-10-2005 à 14:40:22  answer
 

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

n°1223546
IrmatDen
Posté le 14-10-2005 à 21:32:37  profilanswer
 

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.

n°1223566
i'n'i
Posté le 14-10-2005 à 22:22:09  profilanswer
 

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.

n°1224163
i'n'i
Posté le 16-10-2005 à 23:43:05  profilanswer
 

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.

n°1224167
i'n'i
Posté le 16-10-2005 à 23:46:24  profilanswer
 

...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.

n°1224363
HelloWorld
Salut tout le monde!
Posté le 17-10-2005 à 12:01:46  profilanswer
 

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
n°1224408
i'n'i
Posté le 17-10-2005 à 12:58:32  profilanswer
 

ok merci hello world!

n°1224894
i'n'i
Posté le 17-10-2005 à 19:36:40  profilanswer
 

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

n°1224915
i'n'i
Posté le 17-10-2005 à 20:38:19  profilanswer
 

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

n°1226594
i'n'i
Posté le 19-10-2005 à 19:50:15  profilanswer
 

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.

n°1226718
i'n'i
Posté le 19-10-2005 à 23:13:50  profilanswer
 

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

n°1227393
i'n'i
Posté le 20-10-2005 à 19:04:57  profilanswer
 

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?

n°1227728
HelloWorld
Salut tout le monde!
Posté le 21-10-2005 à 09:47:22  profilanswer
 

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
n°1227924
i'n'i
Posté le 21-10-2005 à 12:29:01  profilanswer
 

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

n°1227981
HelloWorld
Salut tout le monde!
Posté le 21-10-2005 à 13:16:48  profilanswer
 

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1228049
i'n'i
Posté le 21-10-2005 à 14:31:04  profilanswer
 

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??

n°1228058
HelloWorld
Salut tout le monde!
Posté le 21-10-2005 à 14:35:53  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  c++ et Qt

 

Sujets relatifs
Plus de sujets relatifs à : c++ et Qt


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)