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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Auteur Sujet :

[qt designer] Interface graphique

n°1354259
nargy
Posté le 26-04-2006 à 12:37:27  profilanswer
 

Reprise du message précédent :
tu passe au constructeur du QPainter le QLabel sur lequel tu veux dessiner,
tu overload la fonction paintEvent pour qu'après avoir dessiné l'image (appel à QLabel:: paintEvent), elle dessine par dessus le dessin du QPainter.
 
ah oui, tu doit créer ta propre classe MyQLabel, héritant de QLabel, pour l'overload.


Message édité par nargy le 26-04-2006 à 12:38:43
mood
Publicité
Posté le 26-04-2006 à 12:37:27  profilanswer
 

n°1354819
++fab
victime du syndrome IH
Posté le 26-04-2006 à 23:41:33  profilanswer
 

nargy a écrit :

si tu fait par exemple:

Code :
  1. printf("%s\n",(const char*) QString("hello" ).replace(QChar('e'),QChar('i')));


tu obtient un joli segfault car l'expression QString(...).replace(...) retourne un QString temporaire, tu la convertit en (char*), puis la QString temporaire est détruite puisque tu n'en a plus besoin, et enfin tu execute le printf. Du coup le (char*) a disparu avant le printf.


QString( "hello" ) est un temporaire. replace renvoie une référence non const sur ce temporaire. L'operator <const char*()> s'applique à la sous expression précédente. Et La durée de vie du temporaire est l'expression entière.  
 

nargy a écrit :

Si ton compilateur ne se comporte pas de cette façon (ça arrive avec les vieux compilos) il n'est pas conforme.


Selon quel évangile ?

n°1354857
nargy
Posté le 27-04-2006 à 03:37:46  profilanswer
 

> Et La durée de vie du temporaire est l'expression entière.
- ouais, mon exemple est bidon, ça marche pas, ou plutot ça plante pas... c'est toujours quand tu t'y attends le moins que ça bug!
> Selon quel évangile ?
- Saint Thomas, je suppose.
 
J'ai déjà eu le problème pourtant, peut être est-ce une version de compilateur, ou de librairie. J'ai forcément pas d'exemple sous la main puisque j'avais corrigé le bug. J'avais cherché une explication, et sur un site quelquoncque  j'avais trouvé comme explication que suivant la dernière norme en vigueur les objets temporaires étaient détruits dès qu'il n'y en avait plus besoin, et que certains compilos continuaient à garder ces objets jusqu'a la fin du bloc courant. Or, si l'opérateur (const char*) n'est pas inline, le compilo n'a pas moyen de vérifier si le pointeur interne à QString retourné par l'opérateur est détruit ou pas.
 
Pour corriger le problème, j'avais donc déclaré une QString plutôt que d'utiliser une variable temporaire, et ça marchait.
Dommage que je n'ai pas d'exemple concret, mais si tu as une autre explication, ça m'interesse.

n°1355001
heyheyhey7​1
Posté le 27-04-2006 à 11:36:59  profilanswer
 

Alors la j'avou je suis pomé de chez pomé,
j'ai créer une fenêtre ->Fenetre::Fenetre(Qwidget *parent,const char * name), ok, après j'ai placé mes composant, dont 2 label pour mettre mes images comme aperçu. pour les mettre en aperçcu j'ai fait Apercu->setPixmap(picture);
 
Bon voila j'ai mes apercu, a partir de cela, comment fair pour mettre une croix et même un rectangle de QPainter? bien sur qui devrons être sur mon label? merci pour l'aide.

n°1355020
nargy
Posté le 27-04-2006 à 11:54:16  profilanswer
 

Ok tu as une classe Apercu qui dérive de QLabel, c'est ça?
Il te reste à réimplémenter la fonction virtuelle paintEvent(), qui est appelée quand le widget a besoin d'être affiché:

Code :
  1. class Apercu: public QLabel
  2. {
  3.   ...
  4.   protected:
  5.   void paintEvent(QPaintEvent* e)
  6.   {
  7.     // afficher l'image
  8.     QLabel::paintEvent(e);
  9.     // dessiner la croix:
  10.     QPainter p;
  11.     p.begin (this);
  12.     // repeindre uniquement ce qui est nécessaire
  13.     p.setRegion(e->region());
  14.     // affiche une ligne
  15.     p.drawline(x1,y1,x2,y2);
  16.     // valider
  17.     p.end();
  18.   }
  19. };


n°1355025
heyheyhey7​1
Posté le 27-04-2006 à 12:00:35  profilanswer
 

Mon apercu est:
 

Code :
  1. Apercu = new QLAbel(this,"Apercu" )

n°1355027
heyheyhey7​1
Posté le 27-04-2006 à 12:02:28  profilanswer
 

après je n'ai pas fait de class Apercu, peu être j'ai un mauvaise facon de programmer

n°1355030
heyheyhey7​1
Posté le 27-04-2006 à 12:04:26  profilanswer
 

en faite, je fait l'apercu qd je clique sur un bouton
d'ou un

Code :
  1. Fenetre::OuvrirImage()
  2. {
  3. ...la j'ouvre et je choisi mon image puis load etc
  4. Apercu->setPixmap(picture)
  5. }


Message édité par heyheyhey71 le 27-04-2006 à 12:04:46
n°1355034
heyheyhey7​1
Posté le 27-04-2006 à 12:12:32  profilanswer
 

en faite a la base, je n'ai qu'une seul class qui est la class Fenetre dans laquel je déclare tous les composants puis après toute mes fonction autre dérive de cet class

n°1355036
nargy
Posté le 27-04-2006 à 12:14:07  profilanswer
 

Il faut que tu crée une classe Apercu, pour pouvoir réimplémenter paintEvent()

mood
Publicité
Posté le 27-04-2006 à 12:14:07  profilanswer
 

n°1355047
nargy
Posté le 27-04-2006 à 12:19:09  profilanswer
 

Comme tu ne doit pas avoir l'habitude, je te donne le code à mettre dans les ``...`` ci-dessus:

Code :
  1. public:
  2.   Apercu(QWidget* parent, const char* name=0, WFlags f=0):
  3.     QLabel(parent, name, f) // appeler le constructeur de label
  4.   {}


n°1355211
heyheyhey7​1
Posté le 27-04-2006 à 15:10:02  profilanswer
 

la class Apercu, je dois la mettre dans le .h c'est ca ?

n°1355229
heyheyhey7​1
Posté le 27-04-2006 à 15:27:35  profilanswer
 

e undéclared et un et dans public erreur de ;

n°1355511
++fab
victime du syndrome IH
Posté le 27-04-2006 à 20:56:34  profilanswer
 

nargy a écrit :

J'ai déjà eu le problème pourtant, peut être est-ce une version de compilateur, ou de librairie. J'ai forcément pas d'exemple sous la main puisque j'avais corrigé le bug. J'avais cherché une explication, et sur un site quelquoncque  j'avais trouvé comme explication que suivant la dernière norme en vigueur les objets temporaires étaient détruits dès qu'il n'y en avait plus besoin, et que certains compilos continuaient à garder ces objets jusqu'a la fin du bloc courant.


les objets temporaires ne sont pas détruit pile quand il n'y en a plus besoin, mais à la fin de l'expression entière.
Comme expliqué ici : http://gcc.gnu.org/onlinedocs/gcc- [...] emporaries.
 

Citation :

Pour corriger le problème, j'avais donc déclaré une QString plutôt que d'utiliser une variable temporaire, et ça marchait. Dommage que je n'ai pas d'exemple concret, mais si tu as une autre explication, ça m'interesse.


Je n'en ai pas d'autres que : la fin de l'expression "entière".
 
Une class String à l'arrache avec un odieux operator <const char*()> :

Code :
  1. #include <iostream>
  2. #include <cstdio>
  3. struct String
  4. {
  5.     String( char const* ss )
  6. : length_( std::strlen( ss ) )
  7. , s_( new char[ length_ + 1 ] )
  8. {
  9.     std::strcpy( s_, ss );
  10. }
  11.     String( String const& ss )
  12. : length_( ss.length_ )
  13. , s_( new char[ ss.length_ + 1 ] )
  14. {
  15.     std::strcpy( s_, ss );
  16. }
  17.     operator const char* () const
  18. {
  19.     return s_;
  20. }
  21.     ~String()
  22. { delete[] s_; }
  23. private:
  24.     std::size_t length_;
  25.     char* s_;
  26.    
  27. };
  28. String func() { return String( "toto" ); }
  29. void f( char const* s ) { std::cout << s << '\n'; }
  30. int main()
  31. {
  32.     char const* s = func();
  33.     f( func() ); // OK
  34.     f( s ); // UB
  35. }


 
f( s ) n'affiche rien sur mon implementation. Et valgrind me condamne.

n°1355686
nargy
Posté le 28-04-2006 à 08:20:47  profilanswer
 

heyheyhey7 1> soit plus précis, fait un fichier à part, apercu.h et apercu.cpp, recopie le code de ces fichiers et la ligne d'erreur qu'on puisse débugger.
 
++fab> je sais pas si on va pas spammer ce topic... bref, ce dont je suis sûr c'est qu'avec GCC3, en utilisant (const char*) sur un QString temporaire j'obtient un segfault, et en déclarant explicitement ce QString il n'y a plus de segfault. Ça m'est arrivé plusieurs fois. Il est fort possible que ce soit un bug de GCC3.
edit: It is dangerous to use pointers or references to portions of a temporary object.
j'avais déjà lu cet article. ça explique assez bien le problème: GNU C++ behavior is standard-conforming, so if your program depends on late destruction of temporaries it is not portable.


Message édité par nargy le 28-04-2006 à 08:25:26
n°1357867
heyheyhey7​1
Posté le 02-05-2006 à 15:32:57  profilanswer
 

bon pour tous ces problem, je me suis débrouillé autrement, j'ai juste un problem, j'ai fait un fonction qui me donne HSV de RGB ok. Elle me retourne le bon H en degré, pour le S, pour avoir la bonne valeur, il faut que je le multipli par 100, et le v je ne voi pas de rapport. Comment ce fait t'il?
Déja normalement je ne devrai même pas a multiplier S par 100, j'ai regardé sur le net, j'ai bien les formules mais voila !! car mon H dois aller de 0 à 360 et les 2 autre de 0 à 100

n°1357874
heyheyhey7​1
Posté le 02-05-2006 à 15:42:50  profilanswer
 

bon j'ai trouvé pour la dernière, ca serai de divisé par 255 et de multiplier par 100 pour V. Est ce correcte ou pas tout ce que je fait la, celon mes tests, c'est bon...

n°1357978
nargy
Posté le 02-05-2006 à 17:43:54  profilanswer
 

  • oula oula
  • la classe QColor est capable de transformer RGB<->HSV
  • si tu fait des calculs en entiers, toujours multiplier avant de diviser, pour garder la précision, et contrôler la taille des entiers (int, short, long..) pour éviter les débordements. En flottant ça sera moins rapide puisque tu as besoin de conversions int<->float, sauf si tu as ensuite besoin d'une grande précision.

n°1358391
heyheyhey7​1
Posté le 03-05-2006 à 10:58:46  profilanswer
 

au et bien en faite, je fait une segmentation avec HSV, donc j'avais fait une fonction qui passai le RGB du pixel pour ensuite les comparé à mes valeur de seuil pour fair une image noir et blanc...
Pour info, j'utilise des float, donc aucun problem pour les entiers

n°1358402
nargy
Posté le 03-05-2006 à 11:07:25  profilanswer
 

Ok, il y a deux façon de voir les choses:
H: 0..360 S:0..100 V:0.100
ou alors tous entre 0 et 1.
De toutes façon, tu doit diviser par 255 à un moment donné pour S et V, et les valeurs intermédiaires.
Le plus simple est de ramener directement RGB entre 0 et 1.

n°1358424
heyheyhey7​1
Posté le 03-05-2006 à 11:20:16  profilanswer
 

oui mais ce que je ne comprend pas, c'est que pour V je divise par 255 puis multiplier par 100 pour le ramener entre 0 et 100, le H met donné directement en degré de 0 à 360 mais le S, je le multiplie par 100 puis j'ai ma valeur entre 0 et 100.
 
pour moi/

Code :
  1. void rgb2hsv(float r, float g, float b,
  2. 00038               float *hout, float *sout, float *vout)
  3. 00039 {
  4. 00040   float h=0,s=1.0,v=1.0;
  5. 00041   float max_v,min_v,diff,r_dist,g_dist,b_dist;
  6. 00042   float undefined = 0.0;
  7. 00043
  8. 00044   max_v = maxrgb(r,g,b);
  9. 00045   min_v = minrgb(r,g,b);
  10. 00046   diff = max_v - min_v;
  11. 00047   v = max_v;
  12. 00048
  13. 00049   if( max_v != 0 )
  14. 00050     s = diff/max_v;
  15. 00051   else
  16. 00052     s = 0.0;
  17. 00053   if( s == 0 )
  18. 00054     h = undefined;
  19. 00055   else {
  20. 00056     r_dist = (max_v - r)/diff;
  21. 00057     g_dist = (max_v - g)/diff;
  22. 00058     b_dist = (max_v - b)/diff;
  23. 00059     if( r == max_v )
  24. 00060       h = b_dist - g_dist;
  25. 00061     else
  26. 00062       if( g == max_v )
  27. 00063         h = 2 + r_dist - b_dist;
  28. 00064       else
  29. 00065         if( b == max_v )
  30. 00066           h = 4 + g_dist - r_dist;
  31. 00067         else
  32. 00068           printf("rgb2hsv::How did I get here?\n" );
  33. 00069     h *= 60;
  34. 00070     if( h < 0)
  35. 00071       h += 360.0;
  36. 00072   }
  37. 00073   *hout = h;
  38. 00074   *sout = s;
  39. 00075   *vout = v;
  40. 00076 }

n°1358427
heyheyhey7​1
Posté le 03-05-2006 à 11:22:00  profilanswer
 

enfin j'ai regardé plusieur code source et les formule sont les même mais pourquoi le S et le V pour être ramener de 0 à 100 sont différents, en faite c'est ca que j'ai du mal a suivre mais bon, visiblement va marche nikel alors après je sais pas trop...

n°1358464
nargy
Posté le 03-05-2006 à 11:40:21  profilanswer
 

à cause de:
s = diff/max_v;
où 0<diff<255 et 0<max_v<255, donc 0<s<1

n°1358498
heyheyhey7​1
Posté le 03-05-2006 à 11:56:43  profilanswer
 

oki oki

n°1361570
heyheyhey7​1
Posté le 08-05-2006 à 10:54:26  profilanswer
 

bon je zappe un peu de programme
 
je dois fair un autre progr similaire à ce dernier mais dans avoir a appuyé sur un bouton pour démarrer tout ca et le traitement dois se fair tout seul
 
mais grande question : ou mettre mon programme pour qu'il démarre seul, car avant, je fesai un lien entre un bouton puis mon programme mais la faut t'il le placé dans mon main ou je lance ma fenêtre ou carrement la ou je construit ma fenêtre ?

n°1361621
heyheyhey7​1
Posté le 08-05-2006 à 12:12:55  profilanswer
 

comment convertir un int en Qstring?
J'ai essayé pas mal de solution mais tous mes retourne des erreurs

n°1361656
nargy
Posté le 08-05-2006 à 13:32:04  profilanswer
 

QString::number(int)

n°1361692
heyheyhey7​1
Posté le 08-05-2006 à 13:59:40  profilanswer
 

merci dsl jlavai pas vu celui ci

n°1361698
heyheyhey7​1
Posté le 08-05-2006 à 14:05:22  profilanswer
 

encore un pti truc.
Comment fair pour qu'un entier est toujours le même nombre de chiffre
je m'explique:
je fait une boucle ou j'ouvre une série d'image une à une
la premire se nomme : image 0000000000.png
et la dernière inqge 0000000666.png
 
et donc je dois ouvrir toutes les images entre ces 2 numéro.
doije bidouiller moi même une fonction ou alors il ya moyen de fair autrement?

Message cité 1 fois
Message édité par heyheyhey71 le 08-05-2006 à 14:05:40
n°1361700
heyheyhey7​1
Posté le 08-05-2006 à 14:09:32  profilanswer
 

et autre problème, je dois affiché les images au fur et a mesure quel se charge.
J'ai fait une boucle d'affichage mais l'IHM ne démarre pas tand que la dernière image n'est pas chargé.

n°1361744
IrmatDen
Posté le 08-05-2006 à 14:43:55  profilanswer
 

heyheyhey71 a écrit :

encore un pti truc.
Comment fair pour qu'un entier est toujours le même nombre de chiffre
je m'explique:
je fait une boucle ou j'ouvre une série d'image une à une
la premire se nomme : image 0000000000.png
et la dernière inqge 0000000666.png
 
et donc je dois ouvrir toutes les images entre ces 2 numéro.
doije bidouiller moi même une fonction ou alors il ya moyen de fair autrement?


Tu as la réponse dans la doc de QString ;)

n°1361749
IrmatDen
Posté le 08-05-2006 à 14:46:15  profilanswer
 

heyheyhey71 a écrit :

et autre problème, je dois affiché les images au fur et a mesure quel se charge.
J'ai fait une boucle d'affichage mais l'IHM ne démarre pas tand que la dernière image n'est pas chargé.


Bienvenue dans le monde des threads!
 
Lis la doc de QThread et l'explication sur le support des threads avec Qt

n°1361758
heyheyhey7​1
Posté le 08-05-2006 à 14:55:17  profilanswer
 

pour le moment je sais pas si je dois utiliser des threads ou pas mais je pense pluto que c'est un probleme de rafraîchissement de ma fenêtre ..

n°1361770
IrmatDen
Posté le 08-05-2006 à 15:13:07  profilanswer
 

QCoreApplication::processEvents pendant ta boucle de traitement alors...
 
Un rafraichissement est un signal traité par la boucle d'événement de Qt dans le thread principal. A priori, ton code s'exécute dans le thread principal, bloquant donc le traitement des signaux.
2 remèdes: les thread ou la fonction processEvents appelée pendant ton traitement (genre après chaque image)

n°1361785
heyheyhey7​1
Posté le 08-05-2006 à 15:39:47  profilanswer
 

oki merci jvai voir ce que jpeu fair pour ca

n°1361788
heyheyhey7​1
Posté le 08-05-2006 à 15:53:55  profilanswer
 

a par contre, mon application que j'ai nommé IHM, est appelé dans le main

Code :
  1. int main(int ArgC, ArgV)
  2. {
  3. QApplication ihm(ArgC,ArgV).
  4. }


 
mais mon programme pour chargé mes images et les afficher se trouve dans fenetre.cpp, la ou son défini mes composant.
Le programme se lance dans le constructeur de ma fenetre
d'ou un ihm.processEvents qui n'est pas reconnu dans mon fenetre.cpp
 
Comment doije fair pour que mon code soit propre?
 
Transvaser ma fonction dans le main.cpp ?
ou laisser comme c'est ?

n°1361792
heyheyhey7​1
Posté le 08-05-2006 à 15:58:51  profilanswer
 

qt on découvre un logiciel c'est pas facile ...
Merci pour toute l'aide d'avance lol

n°1361798
nargy
Posté le 08-05-2006 à 16:15:25  profilanswer
 

Perso, j'aurai fait autrement.
Utilise simplement dans le constructeur de ta fenêtre un timer, cf QTimer::singleShot(), avec un délai de 0.
Fait pointer ce timer vers un slot chargeImages() de ta fenêtre.
Ainsi le constructeur lance le timer, puis rends la main au thread pincipal, qui se charge alors d'afficher la fenêtre puis d'appeler la fonction chargeImages().
 
Tu peut faire de même en lançant un Event dans le constructeur, et en redéfinissant la fonction QWidget::event() de ta fenêtre. La méthode est plus générique, mais utiliser un QTimer est plus simple.

n°1361801
nargy
Posté le 08-05-2006 à 16:16:55  profilanswer
 

err: dsl cest pas QWidget::event, mais QObject::customEvent()

n°1361808
heyheyhey7​1
Posté le 08-05-2006 à 16:23:55  profilanswer
 

bon voila a quoi ressemble mon programme pour le moment :

Code :
  1. #include<stdio.h>
  2. #include<qpainter.h>
  3. #include<qpicture.h>
  4. #include<qwidget.h>
  5. #include<qfiledialog.h>
  6. #include<qapplication.h>
  7. #include"fenetre.h"
  8. #include"objfeat.h"
  9. /* Constructeur de la classe Fenetre */
  10. Fenetre::Fenetre(QWidget *parent, const char *name)
  11.   : QMainWindow(parent, name)
  12. {
  13. /* On definit l'aspect de la fenetre*/
  14. setFixedSize(420,400);  //taille
  15. setCaption("Target tracking (HSV)" );  //nom
  16. /* On definit nos boutons et autres composantes de la fenetre*/
  17. QuitBut = new QPushButton(this, "QuitBut" );
  18. Apercu = new QLabel(this, "Apercu" );
  19. Centerx = new QLabel(this, "Centerx" );
  20. Centery = new QLabel(this, "Centery" );
  21. QuitBut->setText("Quit" ); //nom affiche
  22. Centerx->setText("center x:" );
  23. Centery->setText("center y:" );
  24. QuitBut->move(310, 340); //emplacement
  25. Apercu->move(20,20);
  26. Centerx->move(20,320);
  27. Centery->move(20,340);
  28. QuitBut->resize(70, 30); //taille
  29. Apercu->resize(384, 288);
  30. Centerx->resize(130,30);
  31. Centery->resize(130,30);
  32. /* On relie nos boutons a nos fonctions */
  33. connect(QuitBut, SIGNAL(clicked()), this, SLOT(close()));
  34. Start();
  35. }
  36. /* Destructeur - fait automatiquement */
  37. Fenetre::~Fenetre()
  38. {
  39. }
  40. /******************  FONCTIONS DE BASE  ***************/
  41. //variable global
  42. QImage Picture;
  43. /* On convertit une image en pixmap et on l'affiche  
  44. sur le label Apercu de la classe Fenetre */
  45. void Fenetre::ImageApercu(QImage *picture, QLabel *Label)
  46. {
  47. QImage Mini;
  48. QPixmap temp;
  49.  
  50. Mini = picture->smoothScale(Apercu->width(), Apercu->height(), picture->ScaleMin);
  51. temp.convertFromImage(Mini, 0);
  52. Label->setPixmap(temp);
  53. }
  54. void Fenetre::Start()
  55. bool succes;
  56. int img=10;
  57. QString File ="/home/emilien//imatges2/";
  58. QString Ext = ".png";
  59. do{
  60.     QString Name = "imatge00000000"+QString::number(img);
  61. //printf("\n%s",(const char*)Name);
  62. QString FilePath = File+Name+Ext;
  63. img=img+1;
  64. succes = Picture.load(FilePath);
  65.     if(succes==1)
  66.       {
  67. ImageApercu(&Picture, Apercu);
  68.        }
  69. }while(succes==1);
  70. }


 
j'ai un main.cpp

Code :
  1. #include <qapplication.h>
  2. #include"fenetre.h"
  3. int main (int ArgC, char *ArgV[ ] )
  4. {
  5. //IHM
  6. QApplication ihm(ArgC, ArgV);
  7. Fenetre MainWin;
  8. ihm.setMainWidget(&MainWin);
  9. MainWin.connect(&ihm, SIGNAL(lastWindowClosed()), &ihm, SLOT(quit()));
  10. MainWin.show();
  11. return ihm.exec();
  12. }


 
déja est ce que cela vous parai propre ?
et ensuite, ou mettre ce timer ? dans le constructeur de ma fenetre ?


Message édité par heyheyhey71 le 08-05-2006 à 16:35:37
n°1361811
heyheyhey7​1
Posté le 08-05-2006 à 16:34:25  profilanswer
 

et pour  
 
la premire se nomme : image 0000000000.png
et la dernière inqge 0000000666.png  
 
j'ai regardé dans QString mais a par la longeur de caractère je vois pas car moi je fait un QString::number(img);

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4

Aller à :
Ajouter une réponse
 

Sujets relatifs
methode pour créer une interfaceProblème avec fenêtre graphique
[VBA][Excel] Help ! Problème avec graphique[VBA] [Excel] Chercher la première ligne après un graphique
Interface et classes abstraites en php5 et php6[qt designer] Calcul du centre d'un objet
Question de débutant. Interface HTML pour mes scripts perl ???Créer une interface graphique en c
installer une interface https ? 
Plus de sujets relatifs à : [qt designer] Interface graphique


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