Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/06/2007, à 09:56

svcadg11

QT Designer et les radiobuttons

Bonjour a tous,
je développe actuellement sous QtDesigner et je rencontre un petit soucis^^

J'ai a peu près 300 boutons radio numérotés de 1 à ~300. Ces boutons correspondent a des stations et je ne voudrais en afficher que certains. Le nom des bouton est de la forme _x (x etant un chiffre de 1 à...)

Précision: je ne peux pas numéroter les boutons simplement avec le chiffre car Qt rajoute toujours le _ .

De base, ces boutons ne sont pas affichés. Je voudrait les afficher au moyen d'une boucle pour pouvoir me simplifier la vie. J'illustre ma pensée:

for(i=1; i<11; i++)
    _i->setVisible(true);

Voila ce que j'ai en tête. Mais seulement, Qt n'as pas l'air d'apprécier!

Quelqu'un aurait-il une idée ?

Merci d'avance smile

Dernière modification par svcadg11 (Le 05/06/2007, à 09:57)

Hors ligne

#2 Le 05/06/2007, à 10:18

hello_world

Re : QT Designer et les radiobuttons

Hello,

je pense que ça t'obligerait à réécrire une bonne partie de ton code, mais à mon avis une des seuls solutions serait de faire un tableau de radiobutton. ça m'étonnerais que tu puisse appeler tes boutons via une string.

Bonne chance ;-)

++

Hors ligne

#3 Le 05/06/2007, à 10:21

Astidiel

Re : QT Designer et les radiobuttons

hum c'est un peu normal qu'il n'aime pas...

je te conseille de mettre tout tes boutons dans un conteneur C++ du style Vector.
Pour creer ton vecteur:

vector<T> v;  // renplace T par le type de ton bouton

Ensuite pour acceder aux données ça donne ça:

vector<T>::iterator it;

for (it = v.begin(); it != v.end(); ++it)
    (*it)->setVisible(true);


sachant qu'avec un vecteur tu peut aussi accéder aux données en faisant v[i] (moins propre) ça donne:
for (i = 0; i != v.size(); ++i)
    v[i]->setVisible(true);


Celui qui reçoit une idée de moi reçoit un savoir sans diminuer le mien, tout comme celui qui allume sa bougie à la mienne reçoit la lumière sans me plonger dans la pénombre. Thomas Jefferson

Hors ligne

#4 Le 05/06/2007, à 10:37

toto4455

Re : QT Designer et les radiobuttons

#define bout(a) _##a

for(i=1; i<11; i++)
    bout(i)->setVisible(true);

#5 Le 05/06/2007, à 10:39

svcadg11

Re : QT Designer et les radiobuttons

aaaaaaaaaaaaah fallait avoir l'idée de ca ^^
Je vais tester toutes les propositions mais la plus simple est la derniere. merci a tous je vous tiens au courant d'ici 2 jours smile

Hors ligne

#6 Le 05/06/2007, à 12:29

svcadg11

Re : QT Designer et les radiobuttons

toto4455 a écrit :
#define bout(a) _##a

for(i=1; i<11; i++)
    bout(i)->setVisible(true);

Pour cette solution le compilateur me retourne une erreur en me disant que _a n'existe pas ^^ en gros il ne remplace pas a par la valeur : /

Je n'ai pas encore testé les autres solutions...

ah vi tant que j'y pense, je suis sous Qt3

Dernière modification par svcadg11 (Le 05/06/2007, à 12:48)

Hors ligne

#7 Le 05/06/2007, à 12:50

$Gaël$

Re : QT Designer et les radiobuttons

+1 pour Astidiel !!
Je pense que c'est LA solution.
Perso j'aurais fait la même chose en créant mes boutons dynamiquement et en les mettant dans un vulgaire tableau de boutons mais avec un itérateur et un vecteur (je ne connais pas trop) c'est .... nickel !! Je pense que c'est la meilleure solution objet.

bon courage


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#8 Le 05/06/2007, à 13:08

toto4455

Re : QT Designer et les radiobuttons

heu  oui sad effectivement ,j'ai repondu un peu vite , mea culpa :'(
il va remplacer bout(i) par _i et forcement celle ci n'est pas declaree !
donc +2 pour la solution d'Astidiel lol

#9 Le 05/06/2007, à 13:55

svcadg11

Re : QT Designer et les radiobuttons

Astidiel a écrit :

hum c'est un peu normal qu'il n'aime pas...

je te conseille de mettre tout tes boutons dans un conteneur C++ du style Vector.
Pour creer ton vecteur:

vector<T> v;  // renplace T par le type de ton bouton

Ensuite pour acceder aux données ça donne ça:

vector<T>::iterator it;

for (it = v.begin(); it != v.end(); ++it)
    (*it)->setVisible(true);


sachant qu'avec un vecteur tu peut aussi accéder aux données en faisant v[i] (moins propre) ça donne:
for (i = 0; i != v.size(); ++i)
    v[i]->setVisible(true);

le soucis que j'ai avec ce code est: comment savoir que je selectionne _76 par exemple.

Cela voudrait dire que je dois faire appel a v[75] ?
Car pour moi pour l'instant je n'ai pas dit au vecteur d'inséré mes éléments...

Je n'ai pas recu de formation sur les vecteurs donc un ptit coup de pouce est le bienvenue ^^

En gros la question c est comment associer _76 a une donnée du vecteur smile

Hors ligne

#10 Le 05/06/2007, à 14:09

$Gaël$

Re : QT Designer et les radiobuttons

Regarde dans l'aide (recherche a QVector)
Je n'ai jamais utilisé de vecteurs mais ca devrait donner quelque chose comme ca:

vector <QRadioButton> listeRadio();
listeRadio.append(new QRadioButton(...));//ajoute le radiobutton au vector

Mais comme je disais je crois que tu es "obligé" de créer tes boutons dynamiquement, ou alors tu copie-colle 300 fois la ligne du append en changeant le numéro ...

Sinon pose ta question ici


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#11 Le 05/06/2007, à 14:25

svcadg11

Re : QT Designer et les radiobuttons

merci, deja j'ai la bonne piste jvais tenter de faire ca. Merci a tous smile

Hors ligne

#12 Le 05/06/2007, à 14:32

toto4455

Re : QT Designer et les radiobuttons

Mais comme je disais je crois que tu es "obligé" de créer tes boutons dynamiquement, ou alors tu copie-colle 300 fois la ligne du append en changeant le numéro ...

le plus simple serait quand meme de modifier le code pour passer par un tableau de bouton.

#13 Le 05/06/2007, à 14:39

$Gaël$

Re : QT Designer et les radiobuttons

Ca revient au même (enfin je crois) sauf que le vector est plus puissant, "plus objet" et plus propre (???)


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#14 Le 05/06/2007, à 18:08

Astidiel

Re : QT Designer et les radiobuttons

L'avantage des vecteurs (et autres conteneurs comme map) est la gestion dynamique de la mémoire, et la gestion via des itérateurs. Le vecteur est un conteneur ordonné, donc tu peut savoir ou est ton objet numero 76.  Je te conseille de stocker dans ta classe non pas 300 bouton mais un vecteur de bouton:

vector<T> boutons; //T type de ton bouton

pour l'initialiser, tu peut faire:

boutons.resize(300); //ça permet de réserver la place

puis

for(int i=0;i!=300;i++)
boutons.push_back(  T x = T()   );//push_back insere un element en derniere position de ton vecteur

ensuite tu accède a l'element numéro i grace a:

boutons.at(i)

par la suite au lieu d'utiliser _76 pour utiliser un bouton tu fera boutons.at(76)

j'espère avoir été clair.

Pour toto 4455, il est vrai qu'utiliser un tableau est possible, et mieux appréhendé car les gens ont l'habitude des tableaux. Mais c'est franchement dommage de ne pas utiliser la puissance du langage objet, surtout que les conteneurs sont optimisés, plus rapide et plus fonctionnels.

Dernière modification par Astidiel (Le 05/06/2007, à 18:20)


Celui qui reçoit une idée de moi reçoit un savoir sans diminuer le mien, tout comme celui qui allume sa bougie à la mienne reçoit la lumière sans me plonger dans la pénombre. Thomas Jefferson

Hors ligne

#15 Le 05/06/2007, à 18:15

Astidiel

Re : QT Designer et les radiobuttons

$Gaël$ a écrit :

Regarde dans l'aide (recherche a QVector)
Je n'ai jamais utilisé de vecteurs mais ca devrait donner quelque chose comme ca:

vector <QRadioButton> listeRadio();
listeRadio.append(new QRadioButton(...));//ajoute le radiobutton au vector

Mais comme je disais je crois que tu es "obligé" de créer tes boutons dynamiquement, ou alors tu copie-colle 300 fois la ligne du append en changeant le numéro ...

Sinon pose ta question ici

petite précision:
la méthode append n'existe pas pour les vector


Celui qui reçoit une idée de moi reçoit un savoir sans diminuer le mien, tout comme celui qui allume sa bougie à la mienne reçoit la lumière sans me plonger dans la pénombre. Thomas Jefferson

Hors ligne

#16 Le 06/06/2007, à 08:33

$Gaël$

Re : QT Designer et les radiobuttons

astidiel a écrit :

la méthode append n'existe pas pour les vector

dans la stl peut-être pas mais sous Qt si ! (QVector) tongue
Voici la doc de la classe QVector : http://doc.trolltech.com/4.2/qvector.html

astidiel a écrit :

surtout que les conteneurs sont optimisés, plus rapide et plus fonctionnels

... pas sûr... à vérifier, un tableau est un bête accès en mémoire, les méthodes des vector font plusieurs actions.

Dernière modification par $Gaël$ (Le 06/06/2007, à 08:39)


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#17 Le 06/06/2007, à 13:13

Astidiel

Re : QT Designer et les radiobuttons

$Gaël$ a écrit :
astidiel a écrit :

la méthode append n'existe pas pour les vector

dans la stl peut-être pas mais sous Qt si ! (QVector) tongue
Voici la doc de la classe QVector : http://doc.trolltech.com/4.2/qvector.html

Autant pour moi, j'avais verifié pour Qt3, pas pour Qt4. (D'ailleurs en regardant de plus prêt je m'aperçoit que pour Q3 il y a la classe QValueVector, qui doit faire sensiblement la même chose)

$Gaël$ a écrit :
astidiel a écrit :

surtout que les conteneurs sont optimisés, plus rapide et plus fonctionnels

... pas sûr... à vérifier, un tableau est un bête accès en mémoire, les méthodes des vector font plusieurs actions.

De souvenir (je peut me tromper) l'accès  grâce a la fonction v.at(i) ou v[i] est aussi rapide que si on utilisait un tableau.
L'utilisation d'un itérateur dans une boucle est plus rapide, que l'accès via v[i] ou at(i), On peut faire la même chose avec un tableau en incrémentant un pointeur, mais c'est beaucoup moins pratique.

Un tableau bien gérer est aussi rapide qu'un vector, mais moins fonctionnel, et on perd moins de temps lors de la conception (a condition qu'on sache bien s'en servir).


Celui qui reçoit une idée de moi reçoit un savoir sans diminuer le mien, tout comme celui qui allume sa bougie à la mienne reçoit la lumière sans me plonger dans la pénombre. Thomas Jefferson

Hors ligne

#18 Le 06/06/2007, à 17:45

svcadg11

Re : QT Designer et les radiobuttons

oula merci de ces reflexions pertinentes.
En ce qui concerne ton explication Astidiel je pense l'avoir comprise. Je teste ca demain soir smile

merci encore et je vous tiens au courant smile

Pour info comme dit plus haut jsuis sous Qt3 donc vector je n'ai pas mais value oui wink
a plus

Dernière modification par svcadg11 (Le 06/06/2007, à 17:56)

Hors ligne

#19 Le 07/06/2007, à 08:10

$Gaël$

Re : QT Designer et les radiobuttons

C'est bien Qt4 aussi !! wink


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#20 Le 07/06/2007, à 08:44

Watchwolf

Re : QT Designer et les radiobuttons

Tu peut aussi utiliser une table que tu index avec le nom des radios.

Hors ligne

#21 Le 08/06/2007, à 18:06

svcadg11

Re : QT Designer et les radiobuttons

Vi je sais pour QT4 mais a ce stade je ne peux pas me permettre de reprendre sous QT4 ^^

@Watchwolf pas mal comme idée je comprends mais jsuis pas sur de pouvoir le transposer en code xD


Pour le code j'ai compris mais a la place de T si je ne me trompe pas je dois mettre QButtonRadio non? et remplacer a chaque itération de T or je dois fournir des arguments pour QButtonRadio... : /

Dernière modification par svcadg11 (Le 08/06/2007, à 18:07)

Hors ligne

#22 Le 08/06/2007, à 18:38

$Gaël$

Re : QT Designer et les radiobuttons

Effectivement T=QRadioButton et pour les arguments, tu les fournis à la création de l'objet, lorsque tu mets le bouton dans ton conteneur, en gros ca doit donner:

conteneur.ajouteObjet(new QRadioButton(....));

et lorsque tu parcours ton conteneur tu utilise seulement la référence de l'objet, donc pas besoin d'arguments.


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#23 Le 09/06/2007, à 06:42

svcadg11

Re : QT Designer et les radiobuttons

Astidiel a écrit :
vector<QRadioButton> boutons; //T type de ton bouton

boutons.resize(1); 

//for(int i=0;i!=300;i++)
     boutons.push_back(  QRadioButton x = QRadioButton()   );

boutons.at(i)

J'ai deja commencé par le faire avec un seul bouton avant de mettre ca dans une boucle ^^
En faisant ça, le soucis qui se pose c'est qu'il me demande des argument a la premiere ligne...?? O_o

request for member ‘resize’ in ‘boutons’, which is of non-class type ‘std::vector<QRadioButton, std::allocator<QRadioButton> > ()()’

j'avoue etre un peu pommé :s

Hors ligne

#24 Le 09/06/2007, à 10:02

Astidiel

Re : QT Designer et les radiobuttons

Hum, j'ai poster un petit peu vite, j'ai confondu resize et reserve....

Resize initialise tous les éléments du vecteur. Lorsque les éléments du vector ne sont pas de type simple il faut lui indiquer en deuxième paramètre quel constructeur utiliser. Dans ton cas ce sera plus simple d'utiliser réserve a la place de resize. reserve réserve juste la place dans la mémoire sans changer la taille du tableau.

Si tout tes boutons utilisent le même constructeurs, resize permettrai en une ligne de les initialisés tous, mais je suis pas sur de la syntaxe.


Celui qui reçoit une idée de moi reçoit un savoir sans diminuer le mien, tout comme celui qui allume sa bougie à la mienne reçoit la lumière sans me plonger dans la pénombre. Thomas Jefferson

Hors ligne

#25 Le 09/06/2007, à 10:34

svcadg11

Re : QT Designer et les radiobuttons

ca change pas mal de choses mais j'ai toujours une erreur:

trajet_map.cpp: In constructor ‘trajet_map::trajet_map(QWidget*, const char*, uint)’:
trajet_map.cpp:88: error: expected primary-expression before ‘x’
/usr/include/qt3/qradiobutton.h: In function ‘void std::_Construct(_T1*, const _T2&) [with _T1 = QRadioButton, _T2 = QRadioButton]’:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_uninitialized.h:86:   instantiated from ‘_ForwardIterator std::__uninitialized_copy_aux(_InputIterator, _InputIterator, _ForwardIterator, __false_type) [with _InputIterator = QRadioButton*, _ForwardIterator = QRadioButton*]’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_uninitialized.h:113:   instantiated from ‘_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = QRadioButton*, _ForwardIterator = QRadioButton*]’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_uninitialized.h:254:   instantiated from ‘_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>) [with _InputIterator = QRadioButton*, _ForwardIterator = QRadioButton*, _Tp = QRadioButton]’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:770:   instantiated from ‘typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer std::vector<_Tp, _Alloc>::_M_allocate_and_copy(size_t, _ForwardIterator, _ForwardIterator) [with _ForwardIterator = QRadioButton*, _Tp = QRadioButton, _Alloc = std::allocator<QRadioButton>]’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/vector.tcc:78:   instantiated from ‘void std::vector<_Tp, _Alloc>::reserve(size_t) [with _Tp = QRadioButton, _Alloc = std::allocator<QRadioButton>]’
trajet_map.cpp:85:   instantiated from here
/usr/include/qt3/qradiobutton.h:77: error: ‘QRadioButton::QRadioButton(const QRadioButton&)’ is private
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_construct.h:81: error: within this context
make: *** [trajet_map.o] Erreur 1

Hors ligne