QT4 Comment afficher un objet QPainter dans une fenetre principale??

QT4 Comment afficher un objet QPainter dans une fenetre principale?? - C++ - Programmation

Marsh Posté le 21-02-2008 à 22:01:12    

Bonsoir tous le monde,
 
J'aurais aimé savoir comment afficher un objet QPainter dans une fenêtre principale créée sous QT bien sur.
Est-ce que je doit l'afficher dans un QLayout??
J'ai essayer dans un QSplitter mais vu que QPainter n'hérite pas de la classe QWidget j'ai une erreure lors de la compilation.
 
Merci d'avance

Reply

Marsh Posté le 21-02-2008 à 22:01:12   

Reply

Marsh Posté le 21-02-2008 à 23:32:37    

Salut,
 
Un QPainter n'est pas un widget mais un objet permettant de réaliser des opérations graphiques *sur* un QPaintDevice (QWidget en est un, un peu particulier).
Qu'est ce que tu veux faire exactement ??

Reply

Marsh Posté le 22-02-2008 à 00:02:50    

En fait je crée un histogramme à partir de statistique(avec des drawLine()) et cet histogramme je le trace dans un QPainter. Et je souhaite pouvoir intégrer cet histogramme dans ma fenêtre principale.

Reply

Marsh Posté le 22-02-2008 à 01:44:06    

Quand tu dessines avec QPainter, il faut associé ce QPainter à un QPaintDevice. Tu as fait les tutos que je t'ai indiqué? A partir du tuto 8, c'est expliqué comment dessiné (dans un widget, dans ton cas, un QPixmap pourrait être plus indiqué).

Reply

Marsh Posté le 22-02-2008 à 14:48:02    

J'ai fait les tutoriel que tu m'as indiqué mais je n'ai pas forcément tout tout compru :(  
Par contre j'ai compris qu'il fallait que je créé une classe qui hérite de QDialog et que dans cette classe il fallait que je crée une fonction paintEvent qui sera appelé quand je créerais un objet du type de la classe créé.
Sa m'ouvre bien une fenêtre lorsque je crée l'objet dans ma classe principale mais j'ai l'impression qu'en suite ça boucle à l'infini dans la fenêtre(puisque mon utilisation CPU monte au maximum et le programme plante).  
Je me demande si je fait bien d'utiliser QPainter et si je ne devrais pas plutôt utiliser QGraphicsLineEdit. Et je me demande aussi ce qui ce passe dans ce que j'ai fait pour que ça plante comme sa.
 
voici histogramme.h :
 

Code :
  1. #ifndef HISTOGRAMME_H
  2. #define HISTOGRAMME_H
  3. #include <QPainter>
  4. #include <QPaintEvent>
  5. #include <QWidget>
  6. #include <QDialog>
  7. #include <QMessageBox>
  8. #include "../Code/Session.h"
  9. class Histogramme : public QDialog{
  10. Q_OBJECT
  11. public:
  12. Histogramme(Session* session, QString objetCourant, QWidget* parent = 0);
  13.     void paintEvent(QPaintEvent* );
  14. private:
  15.     Session* mainSession;
  16.     QString itemCurrent;
  17. };
  18. #endif


 
et histogramme.cpp :
 

Code :
  1. #include "histogramme.h"
  2. Histogramme::Histogramme(Session*  session, QString objetCourant, QWidget* parent) : QDialog(parent){
  3.     mainSession = new Session(*session);
  4.     itemCurrent = objetCourant;
  5. }
  6. void Histogramme::paintEvent(QPaintEvent*){
  7.     vector<int> x;
  8.     size_t i =0;
  9.     while(i<mainSession->getTab_Match().size()){
  10.         if(mainSession->FindMatch(i)->getEquipe().size()==2){
  11.             if(mainSession->FindMatch(i)->FindEquipe(0)->getSurnom()==itemCurrent){
  12.                 x.push_back(mainSession->FindMatch(i)->FindEquipe(0)->Stat_By_Equipe()->getReb_def());
  13.             }
  14.             else if(mainSession->FindMatch(i)->FindEquipe(1)->getSurnom()==itemCurrent){
  15.                 x.push_back(mainSession->FindMatch(i)->FindEquipe(1)->Stat_By_Equipe()->getReb_def());
  16.             }
  17.         }
  18.         else{
  19.             if(mainSession->FindMatch(i)->FindEquipe(0)->getSurnom()==itemCurrent){
  20.                 x.push_back(mainSession->FindMatch(i)->FindEquipe(0)->Stat_By_Equipe()->getReb_def());
  21.             }
  22.         }
  23.         i=i+1;
  24.     }
  25.     QPainter graph(this);
  26.     graph.setWindow(-50,-50,100,100);
  27.     graph.setPen(Qt::red);
  28.     graph.setBrush(Qt::black);
  29.     graph.drawLine(0,0,25,25);
  30.     for(size_t k = 1; k >= x.size() ; k++){
  31.         graph.drawLine(k-1,x[k-1],k,x[k]);
  32.     }
  33. }


 
Une session est une classe regroupant un tableau de match et un tableau d'équipe.
Pour chaque équipe j'ai un certain nombre de joueurs.
Et dans match j'ai une ou deux équipe.
 
Encore merci pour le temps que tu passe à m'expliquer.


Message édité par fardke1 le 22-02-2008 à 14:57:58
Reply

Marsh Posté le 22-02-2008 à 14:52:33    

QPainter et QGraphics n'ont pas la même finalité. Utiliser un QPainter, c'est bien, mais effectivement avec le code ce sera mieux (entre balise [cpp ][ /cpp] sans les espaces)

 

Edit: ok; première chose paintEvent est protégée, pas public.

Message cité 1 fois
Message édité par IrmatDen le 22-02-2008 à 14:53:33
Reply

Marsh Posté le 22-02-2008 à 14:59:06    

IrmatDen a écrit :

QPainter et QGraphics n'ont pas la même finalité. Utiliser un QPainter, c'est bien, mais effectivement avec le code ce sera mieux (entre balise [cpp ][ /cpp] sans les espaces)
 
Edit: ok; première chose paintEvent est protégée, pas public.


 
Oups je pense que là ça devient un peu l'overdose de QT^^. Merci

Reply

Marsh Posté le 22-02-2008 à 15:24:40    

En fait ça change pas grand chose d'y mettre en protected j'ai toujours le même problème..

Reply

Marsh Posté le 22-02-2008 à 15:27:59    

fardke1 a écrit :


Code :
  1. QPainter graph(this);
  2.      graph.setWindow(-50,-50,100,100);
  3.      graph.setPen(Qt::red);
  4.      graph.setBrush(Qt::black);
  5.     graph.drawLine(0,0,25,25);//<-j'ai rajouter cette ligne juste pour un test!!!
  6.      for(size_t k = 1; k >= x.size() ; k++){
  7.          graph.drawLine(k-1,x[k-1],k,x[k]);
  8.      }
  9. }




Reply

Marsh Posté le 22-02-2008 à 15:34:06    

fardke1 a écrit :

En fait ça change pas grand chose d'y mettre en protected j'ai toujours le même problème..


Oui, je m'en doute, mais je n'avais pas lu en détail et j'étais reparti dans mon taf ;)
 
Indice t'as une boucle foireuse, précisément celle-ci:

Code :
  1. for(size_t k = 1; k >= x.size() ; k++)


Relis la plusieurs fois s'il le faut, mais c'est une erreur vraiment bête :P Penses à l'indiçage de tableau...

Reply

Marsh Posté le 22-02-2008 à 15:34:06   

Reply

Marsh Posté le 22-02-2008 à 15:47:49    

Oups désolé de déranger pour si peut :pfff:  
La mon problème c'est que la fenêtre s'affiche et repart trop vite j'ai rien le temp de voir.
Alors pour ça aussi j'ai trouvé une réponse dans la documentation de Qt du genre :
 
QTimer::singleShot(1000,this,SLOT(foo()));
 
mais en fait sa marche pas beaucoup!!!!
Alors est ce que je n'utiliserais pas le bon slot???
 
Merci (encore une fois) et excuse moi de t'avoir embêté pour l 'erreur précédente!!!

Reply

Marsh Posté le 22-02-2008 à 15:52:19    

fardke1 a écrit :

La mon problème c'est que la fenêtre s'affiche et repart trop vite j'ai rien le temp de voir.


Tu ne la créerais pas comme variable locale et sur la heap dans une autre fonction (et non dans la classe) par hasard ?

Reply

Marsh Posté le 22-02-2008 à 16:01:42    

Citation :

Tu ne la créerais pas comme variable locale et sur la heap dans une autre fonction (et non dans la classe) par hasard ?


 
En fait je l'appelle dans ma fenêtre principale dans un slot mais le problème c'était surtout que je faisait mon_histo.show() au lieu de faire mon_histo.exec()
 
Et du coup on se rend bien compte maintenant que rien ne ce trace  :heink:  
 
En gros ça ouvre une fenêtre mais il n'y a pas de fond (que j'avais demander noir et il n'y a aucune courbe de tracée.  
Je n'ai pas changer l'échelle mais normalement je devrais quand même voir quelque chose ou au moins le fond noir..
Là y a rien juste un beau fond gris...

Reply

Marsh Posté le 22-02-2008 à 16:07:02    

En fait je t'ai dit une bêtise... là ça n'afficher rien mais c'est parce que j'avais mis la partie du dessus de remplissage du tableau x en commentaire donc normal que ça n'affiche rien...
Par contre maintenant que je re-remplis le tableau je retourne dans une boucle  infinie....

Reply

Marsh Posté le 22-02-2008 à 16:10:50    

C'est bon SA MARCHEEEEEEEEEEEEEEE!!!!
Je te remercie
T'imagine pas comme sa me fait plaisir de voir ce trait^^
Bon il me reste quelque petit problème je te dirais si je me débloque pas mais pour le moment je vois le graphique!!!

Reply

Marsh Posté le 22-02-2008 à 16:26:42    

D'ailleurs c'est un peu en dehors du post mais est-ce que tu connais un tutoriel qui pourrais m'indiquer comment je peux faire que le logiciel que j'ai créer on puisse l'installer et l'utiliser sur un ordinateur sans Qt et mingw. En gros comme un logiciel normal que l'utilisateur n'ai qu'à installer à partir d'un setup.

Reply

Marsh Posté le 22-02-2008 à 16:32:58    

Tu peux regarder du côté de InnoSetup ou NSIS. Au niveau réputation, le premier est plus facile, mais moins puissant que le second. Pour l'instant, le premier me suffit bien, vu que j'ai pas besoin de killer features dans l'installeur. Donc je te recommande celui-ci (au moins pour commencer ou te faire une première idée).

Reply

Marsh Posté le 22-02-2008 à 18:21:05    

Et une dernière chose :
quelle est la fonction qui permet de redimensionner un QPushButton (hauteur et largeur) parce que setFixed...() ne fonctionne pas???

Reply

Marsh Posté le 22-02-2008 à 18:53:06    

Si, ça devrait fonctionner, tu as un problème quelque part. Sinon, en moins contraignant, tu as resize.

Reply

Sujets relatifs:

Leave a Replay

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