2010-01-30 4 views
2

J'essaie de garder une trace du signal textChanged() pour une poignée de QTextEdits. Je veux faire la même chose indépendamment de l'édition de texte qui émet le signal: décochez sa case associée dans un QListWidget s'il devient vide et laissez-la cochée sinon. La fonction que j'ai donc pour est la suivante:Connexion de plusieurs signaux à un seul emplacement dans Qt

void MainWindow::changed() 
{ 
    QString tempStr = ui->hNMRedit->toPlainText(); 
    if(tempStr != "") 
    { 
     ui->checkList->item(0)->setCheckState(Qt::Checked); 
    } 
    else 
    { 
     ui->checkList->item(0)->setCheckState(Qt::Unchecked); 
    } 
} 

Avec l'approche actuelle, je dois faire une fonction comme celui-ci pour chaque QTextEdit; chaque fonction contenant un code pratiquement identique. Si je stockais chacune des modifications de texte dans un tableau (afin que je puisse trouver leur index associé dans le QListWidget), serais-je possible d'avoir un slot comme ça? Est-ce possible ou devrais-je simplement créer un emplacement distinct pour chaque modification de texte? S'il vous plaît laissez-moi savoir si d'autres précisions sont nécessaires! Enfin, je pense que la seule différence significative entre QLineEdits et QTextEdits est la taille par défaut. En faveur de la cohérence, devrais-je simplement utiliser un de ces objets dans mon interface utilisateur?

Merci !!!

Répondre

3

Je pense qu'il vous manque le point des fentes et des signaux. Comment créez-vous les connexions? Etes-vous en train d'essayer de cocher une case lorsque l'une des zones de texte change? Si c'est le cas, utilisez un QSignalMapper pour mapper les signaux textChanged() afin d'envoyer la valeur true et connectez-le à l'emplacement QCheckBox setChecked(bool).

Si cela est trop compliqué sous-classe QCheckBox et créer un ensemble de fonctions checkBox()uncheckBox() de sorte que vous pouvez basculer les états sans une variable. Connectez ensuite le QTextEdit textChanged() à votre sous-classe checkBox()

Si ce n'est pas ce que vous cherchez, au moins sous-classe QTextEditto prendre dans un QCheckBox qu'il peut changer lorsque le texte change au lieu de duplication de code pour chaque QTextEdit

+0

Je suis d'accord sur QSignalMapper ... Cela facilitera grandement la gestion basée sur les baies. –

+0

Ça sonne bien, je vais essayer le QSignalMapper. La seule partie difficile est la QCheckBoxes sont dans un QListWidget ... Je ne sais pas si je serai capable de connecter le slot vérifié comme vous l'avez décrit. Pensez-vous toujours qu'il sera capable de travailler? Il y a aussi quelques QLineEdits que je voudrais connecter au slot unique dont j'ai parlé plus haut. Pour plus de commodité, devrais-je les changer tous en QTextEdits (pour pouvoir les stocker dans le tableau et utiliser la même fonction sur l'objet reçu)? –

+0

'QCheckBoxes': Oui, soit au moment de la création, soit après, vous avez accès à eux. Si vous tentez d'y accéder après les avoir placés dans la liste, vous devez soit conserver le pointeur, soit le lancer après avoir appelé l'une des fonctions de l'objet get. 'QLineEdits': vous ne devriez pas avoir à les stocker en tant que pointeurs' QWidget' et à les exclure lorsque vous avez besoin de fonctionnalités spécifiques. –

0

Tout ce dont vous avez besoin est un hachage de QAbstractButton*, entré par QTextEdit*. Dans la fente, vous cherchez le sender() dans le hachage, si vous avez trouvé le bouton dont vous avez besoin. C'est précisément ce qui est fait par le QSignalMapper: vous pouvez mapper d'un expéditeur QWidget* à votre bouton QWidget*. Utilisez qobject_cast pour passer à QAbstractButton*.

Questions connexes