2009-04-28 4 views
0

J'essaie actuellement de terminer un projet en utilisant Qt4 et C++. J'utilise des boutons pour basculer entre les états. Tout en essayant de relier les boutons clicked() signaux au textEdit pour afficher l'état concerné, je suis resté bloqué sur une erreur:Les emplacements existants Qt4 ne sont pas reconnus

Object::connect No such slot QTextEdit::append("move state") Object::connect No such slot QTextEdit::append("link state")

Seulement, QTextEdit a certainement une fente append (QString).

Des idées?

Quelques exemples de code:

QPushButton *move = new QPushButton("Move"); 
connect(move, SIGNAL(clicked()), textEdit, SLOT(append("move state"))); 

Répondre

6

On ne passe pas dans une fente argument (littéralement) à la append() lors de la prise d'un signal de connexion fente.

Vous faites référence à elle comme une signature de méthode:

SLOT(append(QString)) //or const QString, I'm not sure 

Si vous avez besoin du champ de saisie pour ajouter les mots « déplacer l'état » à chaque fois que le bouton est cliqué, vous devez définir votre propre emplacement qui fera l'append.

+0

Cela ne fonctionne pas. Vouliez-vous dire mettre la signature de la méthode entre guillemets? Merci. – pypmannetjies

+0

Oh merde, désolé, je travaille à la fois Qt et PyQt et utilisé la mauvaise syntaxe. Oui, certainement ne voulait pas dire les citations lol ... –

+0

Merci pour l'aide – pypmannetjies

4

Chris l'a en un mot.

C'est l'une des nombreuses raisons pour lesquelles boost :: signale beaucoup plus (vous pouvez utiliser boost :: bind). Vous allez fondamentalement avoir besoin de créer une autre fonction qui capture le signal, puis effectue l'ajout.

... 

QPushButton *move = new QPushButton("Move"); 
connect(move, SIGNAL(clicked()), textEdit, SLOT(MoveState())); 
} 

... 

void MyTextEdit::MoveState() 
{ 
    append("move state"); 
} 
1

En supposant que vous aurez d'autres QPushButton s qui causeront d'autres états de se produire, vous pouvez les mettre dans un QButtonGroup. Ensuite, vous pouvez utiliser une énumération, telle que { MOVE_ID, STOP_ID, ... } pour faire référence aux états possibles.

QPushButton* move = new QPushButton("Move") ; 
QPushButton* stop = new QPushButton("Stop") ; 
QButtonGroup* buttonGroup = new QButtonGroup() ; 
buttonGroup->addButton(move, MOVE_ID) ; 
buttonGroup->addButton(stop, STOP_ID) ; 

// Connecting QButtonGroup to writing function 
connect(buttonGroup, SIGNAL(buttonClicked(int)), 
     textEdit, SLOT(append(int))) ; 

En textEdit, vous définissez une fonction qui ajoute le texte approprié en fonction de l'état dans lequel vous obtenez.

void append(int i) 
{ 
    switch (i) 
    { 
     case MOVE_ID: 
     textEdit->append("move state") ; 
     break ; 
     case STOP_ID: 
     textEdit->append("stop state") ; 
     break ; 
    } 
} 
3

Utilisez un QSignalMapper pour passer un argument codé en dur à l'emplacement de l'édition de texte.

Exemple:

QSignalMapper* signalMapper = new QSignalMapper(this); 
QPushButton* move = new QPushButton("Move"); 
signalMapper->setMapping(move, QString("move state")); 
connect(move, SIGNAL(clicked()), signalMapper, SLOT(map())); 
connect(signalMapper, SIGNAL(mapped(QString)), textEdit, SLOT(append(QString))); 

méfiez-vous des bugs dans le code ci-dessus.

Questions connexes