2010-02-05 11 views
0

J'écris une calculatrice simplifiée en utilisant Qt avec C++, à des fins d'apprentissage. Chaque nombre est un QPushButton qui utilise le même emplacement pour modifier le texte d'un widget lineEdit utilisé comme affichage.Moins de connexions dans une calculatrice Qt

L'emplacement utilise la méthode expéditeur() pour déterminer quel bouton a été enfoncé, afin que le nombre correct soit écrit sur le widget d'affichage.

Afin d'avoir tous les boutons de travail, je dois écrire une connexion à chacun d'eux, un peu comme ceci:

connect(ui->button1, SIGNAL(clicked()), this, SLOT(writeNum())); 

Comme ils utilisent tous le même emplacement, la seule chose qui les changements sont le bouton utilisé, donc l'expéditeur suivant sera ui->button2, ui->button3, et ainsi de suite. Ma question est la suivante: existe-t-il un moyen de réduire le nombre de connexions définies?

Editer: Here est un lien utile discutant précisément de ce problème, en détail.

Répondre

2

Si vous utilisez QtDesigner ou l'éditeur de formulaire de QtCreator, vous pouvez simplement faire glisser des lignes entre les 2 et il remplira le code pour vous.

Vous pouvez également conserver tous les boutons dans une structure de liste, mais j'utiliserais un QVector non un tableau standard.

Vous pourriez également vouloir reconsidérer en utilisant la méthode sender(), il viole la conception OOP. Au lieu de connecter tous les boutons à un QSignalMapper, puis connectez mapped() à votre zone de texte.

+0

Merci pour le conseil sur QSignalMapper, je pensais qu'il y aurait une meilleure façon de le faire. –

1

Je pense que vous pouvez allouer le QPushButton dans un tableau, quelque chose comme ça

QPushButton* numbers = new QPushButton[10]; 

Et puis, effectuez les connexions en utilisant une boucle

for(size_t i = 0; i < 9; ++i) 
{ 
    connect(numbers[i],SIGNAL(clicked()),this,SLOT(writeNum())); 
} 

Mais je ne pense pas que ce soit vaut. La connexion explicite, tout en rendant le code plus verbeux, rend les connexions plus claires pour le lecteur.

+0

Question était en fait de réduire les connexions, vous restructurez juste. Je doute qu'il y aura une différence en binaire (si vous activez les optimisations de base). – drahnr

+0

@ soxs060389 True. Mais même en utilisant des choses comme QSignalMapper, probablement le nombre de connexions resterait le même, seulement avec une couche supplémentaire d'abstraction qui le cacherait. – cake

+0

vous avez raison, mais il est possible de masquer n-1 de n connexions de l'utilisateur, si vous créez une structure de classe agréable – drahnr

2

Vous devez utiliser un int dans ce cas pour identifier le bouton qui a envoyé le signal à votre emplacement. Essentiellement, vous utilisez QSignalMapper pour cette tâche:

QSignalMapper sm; 

QPushButton* one = new QPushButton(this); 
QPushButton* two = new QPushButton(this); 
QPushButton* three = new QPushButton(this); 
//and so on... 

sm.setMapping(one, 1); 
sm.setMapping(two, 2); 
sm.setMapping(three, 3); 
//and so on... 

connect(one, SIGNAL(clicked()), &sm, SLOT(map())); 
connect(two, SIGNAL(clicked()), &sm, SLOT(map())); 
connect(three, SIGNAL(clicked()), &sm, SLOT(map())); 
//and so on... 



connect(&sm, SIGNAL(mapped(int)), this, SLOT(yourslothere(int))); 

Note: QSignalMapper est très utile, gardez cela à l'esprit;)

+0

merci, +1 pour avoir montré comment utiliser QSignalMapper –