Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > [Qt]Grouper des QInputDialog > Lecture du sujet

[Qt]Grouper des QInputDialog

saisie de variables

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne bubuche # Posté le 30/06/2008 à 22:48:25
KIM, et tout deviens possible.
Avatar
Groupe : Membres
Bonjour tout le monde.
Je vais d'abord commencer par raconter ma vie, ensuite je vous ferais part de mon problème. Alors, il y a quelques années j'ai commencé à programmer (heu, deux ans quoi :euh: ). Je n'avais jamais programmé avant, mais j'ai appris assez vite. Mon premier langage (sans compter le html etc) a été le PHP. J'ai créé un logiciel de retouche d'image en PHP, qui, ma foi, marche assez bien (repérage d'une zone par teinte, application d'un masque, relief, modification des contrasts, modification de la luminosité (avec deux algo, un qui augmente tout à la bourrin (avec "brûlage" des blanc donc) et un autre qui fait tendre les couleurs vers le blanc... j'en suis si fièr :) )). Donc, bref, de ce coté pas de problème. Enfin, j'ai commencé à en avoir marre des contraintes d'aller retour serveur et des pages trop statiques, même avec du javascript. J'ai donc suivi les conseil de quelqu'un... et je suis passé en langage compilé :D.

Hmm, quelle rapidité, fantastique ^^
J'ai commencé à refaire mes programmes en SDL, et tout marchait... hm, très bien si on tient compte du fait que je n'avais qu'a appeler les fonctions et qu'elles faisaient bien leur boulot (mais je devais recompiler à chaque fois :-° ).

J'ai essayé de creer une interface, et j'en été à mon générateur-automatique-de-bouton, et mon champ-de-saisie-de-text-n'importe-ou quand j'en ai eut marre et que je me suis mit à Qt.

Bon, pour l'instant, il n'y a pas de problème, tout va bien sauf que...


J'en arrive à mon problème qui me préoccupe: je souhaiterai faire une fenètre modal, qui me permette de grouper un ensemble de "champs" de fomulaire variés (allant de la saisie de text, à celle d'entier, en y ajoutant les case à cocher et les "slider" (pour la teinte)). Le problème c'est que je n'ai pas trouvé de méthode pour connecter un champ avec... une variable.

Je m'explique :

j'ai fait une classe (KDialog) qui génère automatiquement :
une fenètre modal avec :
un bouton "ok" et un bouton "annuler" :
qui dispose d'une methode nommée "addWidget" qui permet d'ajouter des Widget au dessus de ces deux boutons.
Pour cela, j'ai simplement fait un fenêtre modal avec un QGridLayout avec un tableau de deux lignes, la première colonne contenant un layout servant a contenir les widgets ajoutés, et la seconde servant à contenir les deux boutons. Je sais, je code comme un porc :p

Mais là n'est pas la question, parce que tout cela marche très bien. Le seul problème et que je voudrai pouvoir écrire quelque chose du genre

QObject::connect(mon_champs, SIGNAL(valueChanged(int)), KDialog(), SLOT(setValue(&variable_pour_recuperer_la_valeur, int)));

setValue est une méthode slot surchargée qui prend toujours en paramètre deux variable : une adresse et une valeur; elle affecte la valeur à l'adresse. C'est un niveau d'abstraction fonction pour l'opérateur d'affectation, puisque le slot ne peut être qu'une fonction. Les deux variable sont toujours de même type, bien sur.

et que ça ne marche pas : il me dit 'QObject' is an inaccessible base of 'KDialog'
Je pense que ça doit vouloir dire qu'il ne veut pas d'une classe qu'il ne connait pas parce qu'il n'y a pas de méthode surchargée pour Connect derrière ... même si mon KDialog hérite de QWidget, qui lui même hérite de QObjet.

Bref, j'en ai marre de tout ça, alors je vous demande :
comment faire une saisie de plusieurs données, dans le genre "modale"?


en gros, l'utilisateur clique sur "luminosité", il y a une petite fenêtre qui s'ouvre avec un champ (ou un slider) pour la valeur, et une petite case à cocher pour la type (entre les deux que je vous ai décris juste avant).
Je voudrai savoir si il existe un truc "fait pour", pour ne pas réinventer la roue (même si c'est toujours instructif d'essayer, pour comprendre les mécanisme interne et pour s'entrainer).

Merci d'avoir lu tout ça et désolé pour le dérangement.

P.S : j'étais en première année d'info cette année, et je passe en deuxième année. J'ai eut 20 en algo et 19 en info (le prof m'a enlevé un point parceque *ptr++ n'augmente pas la valeur pointée par ptr, mais fais avancer ptr d'un cran soi-disant :colere: ).
Bon, je code peut être comme un porc, mais je peux apporter des preuves de tout ce que j'ai dit (capture d'écran et code à l'appui).

Merci pour votre aide, merci d'avance. Je suis prêt à faire beaucoup d'effort et à chercher à comprendre (et sur google, mais c'est déjà fait, sans succès).

Un tuto : ce n'est pas la dernière boite à la mode, ni du code à copié coller : c'est une méthode pour apprendre ! :colere2:
"Il ne faut pas confondre rêver sa vie et vivre ses rèves."
KIM, just all you need ... and so much more !
 
Hors ligne minirop # Posté le 30/06/2008 à 22:56:24
吸血鬼
Avatar
Modérateurs
Citation : bubuche
(le prof m'a enlevé un point parceque *ptr++ n'augmente pas la valeur pointée par ptr, mais fais avancer ptr d'un cran soi-disant :colere: ).

c'est vrai, ++ est évalué avant * ;)

sinon pour ton problème, j'avais fait une classe qui prend des pointeurs dans le constructeur (ou des setters) et qui modifiait le pointeur.

pas commencés - en cours - finis - (dernier tome lu)
manga : Love Hina - Ichigo 100% - Fruits Basket - School Rumble - Death Note - Parmi Eux - One Piece (46) - Naruto (45) - Lovely Complex (10) - Fullmetal Alchimist (22) -> My Manga
IDE multiplateforme pour Qt Image utilisateur !! Qt @ IRC --> #qt-fr@irc.freenode.net
 
Hors ligne bubuche # Posté le 30/06/2008 à 23:56:28
KIM, et tout deviens possible.
Avatar
Groupe : Membres
si je comprend bien l'idée, je dois faire une classe qui fait tout l'affichage et tout et tout, et qui surtout à une série de variables : int, QString, float, double... qui lui permettent de stocker les données qui seront ensuite renvoyées par des accesseurs... :euh:
Hormis le fait que pour avoir quelque chose de vraiment toujours opérationnel, je devrais faire un tableau de taille dynamique pour contenir un nombre arbitraire de de variable de type voulu, ça n'est pas un peu compliqué ? ^^

bon, comment je voyais la chose c'était :

je déclare mes boutons et je les "lient" à une variable. Quand la valeur du "champs" (radio, input etc, je pense que vous comprenez ^^) change, la valeur de la variable change.

Et je me sers de ma classe KDialog uniquement pour afficher tout ce beau monde et lui donner le coté "modal".
Comme ça c'est à la fois souple (je peux rajouter des layout et des wigets comme je veux) et puissant (il y a un lien entre la valeur du champs et celle de la variable).

Hm, ceci dit, mon probl_me réside dans ce lien. Parce que je n'arrive voudrait faire une méthode super surchargé (avec des dizaines d'en tête quoi ^^), juste pour faire office de "slot d'affectation".
Et je n'y arrive pas :euh:

Merci beaucoup pour ton aide en tout cas ;)

EDIT : J'AI TROUVE LE PROBLEME

... mais je ne sais pas comment le résoudre :-°

bon, alors, dans le cas d'un signal/slot, il n'est pas possible de passer des variables au slot (que des types) . Eh oui, c'est bète mais c'est comme ça ^^.
Donc, une solution serait d'encapsuler la variable dans un petit objet fait que pour ça, auquel on donnerait une variable dans un premier temps (il stockerait une adresse d'entier par exemple), et ensuite l'air de rien on le connecterait à un slot : à chaque fois que le slot serait changé, il changerait la valeur en face.

C'est ce genre de chose que tu proposais? Je crois que oui, et si c'est le cas, je te remercie.
Même si ça me donne envie de vomir ce genre de solution. Alors, plutôt que d'imaginer qu'on puisse directement connecter une variable à un signal, il faut ajouter une niveau d'abstraction par rapport à ce signal et un par rapport à la variable. Bon, eh bien, heureusement que j'ai la tête solide :pirate:

j'attends toujours vos réponse, au cas ou quelqu'un aurait une idée.
Au fait, est-ce que c'est possible de définir ses propres macros au préprocesseurs, comme le fait Qt? Genre, quand on remplacerai SLOT par VAR et dès qu'il verrait ça, il créerait un objet du type qu'il faut, lui passerait l'adresse et tout et tout? Non, c'est encore plus complexe ^^

ok, je laisse ça ouvert en attendant des réponse :)

( o_O deux heures du mat. Eh ben, j'aime la programmation ^^ )


RE-EDIT :
Alors, j'ai fait mon objet KVar, et je l'ai généralisé pour que son constructeur prenne par défaut une adresse de variable d'un des types suivant : entier, flottant, réel double précision, QString et booléen. Bien sur en rajouter d'autres serait possibles, sans grand problème. Ensuite, l'appel se fait dans le slot par la méthode setValue (qui prend un entier, un flottant, etc).
Bon, ce qui me dérange c'est que je dois creer un objet à chaque fois, mais si on considère que le stockages des différentes adresses se fait dans une union, je pense que ça ne prend pas trop de place.

Je vais essayer de trouver une méthode pour ne plus avoir à creer d'objet, mais je pense que ça va être difficile (même si je pourrait creer une objet avec une méthode statique qui prendrait une adresse en paramètre et génèrerait automatiquement un objet de type KVar en lui passant cette adresse, le problème viens du fait que lors de l'appel, si plusieurs int ont été définie ainsi, je ne pourrais pas les différencier...
Donc, ce n'est pas encore parfait ^^

Eh, je pense que je vais faire un tuto sur le traitement d'image pixel par pixel, mais je voudrai savoir si il vaudrait mieux que je le fasse en SDL, en PHP ou en Qt. Parce que bien sur, je ne vais pas apprendre aux gens à faire une jolie interface (qui ne serait qu'une couche entre la saisie de l'utilisateur et l'appel de la fonction :-° ), mais bien à traiter l'image derrière.
Je pense que je vais aborder :
mettre une image en nuance de gris;
inverser les couleurs d'une image; (les deux là pour se mettre en jambe ^^)
modifier la luminosité d'une image avec deux méthodes
modifier les contrastes d'une image
mise en relief d'une image
en exercice : mettre une image en nuances de gris selon les composants rouge et/ou vert et/ou bleu seulement (facile ;) )
appliquer un masque sur une image
utiliser une image monochrome pour indiquer les zone à traiter (très pratique :p )
utilisation d'une image en nuances de gris comme indicateur de traitement (un peu plus dur, mais permet d'obtenir des effets très intéressants).
Et enfin approche de tout ça avec l'utilisation des composate HSV plutôt que rgb (j'adooore le HSV, c'est trop pertinent comme info ^^ )

voila, je ne sais pas encore, je n'ai rien vu qui ressemble à ça dans la masse de tuto, mais je l'ai peut être raté.

Bon, sauf cette disgression, je laisse pour l'instant le sujet ouvert, jusqu'à ce que quelqu'un vienne me dire si il existe ou non une méthode "officiele" pour connecter signaux et variables. Comme ça je pourra finir avec un post et mettre soit la solution officiel, soi celle que j'ai/minirop a trouvé.

Voila, voila, c'est tout pour l'instant :)
Édité le 01/07/2008 à 14:48:36 par bubuche

Un tuto : ce n'est pas la dernière boite à la mode, ni du code à copié coller : c'est une méthode pour apprendre ! :colere2:
"Il ne faut pas confondre rêver sa vie et vivre ses rèves."
KIM, just all you need ... and so much more !
 
Hors ligne Jet74 # Posté le 11/07/2008 à 22:03:54
Sans moto, la vie n'est rien !
Avatar
Groupe : Membres
euh sinon tu fais un slot pour chaque slider et tout et tout qui va modifier une variable déclarée dans le .h (donc accessible dans toutes les méthodes de la classe) et tu les relies avec un connect(sliderRouge, SIGNAL(valueChanged(int)), this, SLOT(updateVariableSliderRouge(int))); et ainsi de suite :soleil: !

Image utilisateur
La complexité d'une erreur est inversement proportionnelle au temps mis pour la trouver.
 
Hors ligne bubuche # Posté le 14/07/2008 à 12:48:31
KIM, et tout deviens possible.
Avatar
Groupe : Membres
heu, oui, c'est une solution, mais aussi un peu bourrin ^^

pour l'instant, la syntaxe que je peux écrire est aussi courte que ça :
connect(sliderRouge, SIGNAL(valueChanged(int)), new KVar(&variable), SLOT(setValue(int)));

c'est pas très joli, mais ça marche. La méthode setValue est surchargée pour plein de type, et les pointeurs sont stockés dans une unions, pour ne pas trop prendre de place (comme ça, ça prend la place d'un pointeur), et il y a une variable de type char pour stocker le type du pointeur en cour, en utilisant des constant (comme TYPE_INT, TYPE_FLOAT) etc. Mais bon, j'ai comme un bon espoir que les constantes n'appartiennent pas vraiment à un objet (si elles sont constantes : elles ne peuvent pas être modifiées, et leurs valeurs sont toujours pareil => il est logique qu'il n'en existe qu'un exemplaire pour toutes les instances de classes).

Mais merci, c'était aussi une bonne idée (même si je venais à déclarer une fonction pour chaque variable :-° )

P.S : heu, j'aurai aussi pu surcharger le constructeur pour qu'on ai pas à passer un pointeur (pour pouvoir écrire new Kvar(variable) au lieu de new Kvar(&variable), en tripatouillant derrière avec des référence, mais ça ne me parait pas très propre, alors je préfère garder une syntaxe un peu plus lourde mais plus clair.

hum, j'attend encore demain et je mets résolu, ok?

et je mettrai aussi le code de KVar pour que vous puissiez en profiter ^^
amicalement,
Bubuche

Un tuto : ce n'est pas la dernière boite à la mode, ni du code à copié coller : c'est une méthode pour apprendre ! :colere2:
"Il ne faut pas confondre rêver sa vie et vivre ses rèves."
KIM, just all you need ... and so much more !
 

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 113 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.0373s (0.0231s)