c++ et Qt - C++ - Programmation
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
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.
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.
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?
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.
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.
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.
Marsh Posté le 09-10-2005 à 18:21:02
A part à te coltiner les sources de qmake, je connais rien d'autre
Marsh Posté le 09-10-2005 à 18:34:56
Moi je fais ca :
Code :
|
Dans mon rep. aevc tout mes sources, ca me creer un monProjet.pro
Ensuite :
Code :
|
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
Des que tu change tes .ui, regenre le .pro et le .xcode
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)?
Marsh Posté le 09-10-2005 à 23:01:45
c'est le comportement de base de ce que je viens de te montrer
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!
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?
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.
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 : |
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.
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.
Marsh Posté le 11-10-2005 à 16:33:11
ReplyMarsh 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).
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.
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.
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.
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.
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.
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.
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.
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.
Marsh Posté le 17-10-2005 à 20:38:19
Non c'est bon, j'ai trouvé, il faut faire un setBrush(Qt::color);
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.
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
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?
Marsh Posté le 21-10-2005 à 09:47:22
Citation : |
là tu demandes d'appeler le slot Test(), qui n'existe pas...
Marsh Posté le 21-10-2005 à 12:29:01
ouais pardon, je fais bien SLOT(ChangeColor())); et ça ne marche pas qd-même
Marsh Posté le 21-10-2005 à 13:16:48
Vérifie que ton slot est bien appelé, et fait un repaint().
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??
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.
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