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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1690384
fardke1
Posté le 21-02-2008 à 22:01:12  profilanswer
 

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

mood
Publicité
Posté le 21-02-2008 à 22:01:12  profilanswer
 

n°1690402
IrmatDen
Posté le 21-02-2008 à 23:32:37  profilanswer
 

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

n°1690410
fardke1
Posté le 22-02-2008 à 00:02:50  profilanswer
 

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.

n°1690423
IrmatDen
Posté le 22-02-2008 à 01:44:06  profilanswer
 

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

n°1690718
fardke1
Posté le 22-02-2008 à 14:48:02  profilanswer
 

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
n°1690725
IrmatDen
Posté le 22-02-2008 à 14:52:33  profilanswer
 

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
n°1690730
fardke1
Posté le 22-02-2008 à 14:59:06  profilanswer
 

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

n°1690753
fardke1
Posté le 22-02-2008 à 15:24:40  profilanswer
 

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

n°1690758
fardke1
Posté le 22-02-2008 à 15:27:59  profilanswer
 

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




n°1690766
IrmatDen
Posté le 22-02-2008 à 15:34:06  profilanswer
 

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

mood
Publicité
Posté le 22-02-2008 à 15:34:06  profilanswer
 

n°1690782
fardke1
Posté le 22-02-2008 à 15:47:49  profilanswer
 

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

n°1690787
IrmatDen
Posté le 22-02-2008 à 15:52:19  profilanswer
 

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 ?

n°1690804
fardke1
Posté le 22-02-2008 à 16:01:42  profilanswer
 

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

n°1690812
fardke1
Posté le 22-02-2008 à 16:07:02  profilanswer
 

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

n°1690818
fardke1
Posté le 22-02-2008 à 16:10:50  profilanswer
 

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

n°1690828
fardke1
Posté le 22-02-2008 à 16:26:42  profilanswer
 

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.

n°1690836
IrmatDen
Posté le 22-02-2008 à 16:32:58  profilanswer
 

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

n°1690938
fardke1
Posté le 22-02-2008 à 18:21:05  profilanswer
 

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

n°1690957
IrmatDen
Posté le 22-02-2008 à 18:53:06  profilanswer
 

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


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

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

 

Sujets relatifs
Ouvrir une fenetre windowsMettre a la bonne échelle un QPixMap à la taille du QPushButton (Qt4)
Problème avec Qt4Afficher &quot; en html avec un echo php ??!!
[HTA] Taille de fenêtre d'une application HTAAnimation flash veut pas s afficher. Help !!!!!
Faire un screenchot d'un objet ou d'une zone (Winform)Intégrer ogre3D dans une fenêtre MFC
itextsharp Afficher HTML[RESOLU]Fenetre confirm JAvascript
Plus de sujets relatifs à : QT4 Comment afficher un objet QPainter dans une fenetre principale??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR