2017-02-26 8 views
0

Comment quelqu'un peut-il référencer un QObject en utilisant un QString? J'ai essayé d'accomplir ceci de plusieurs manières différentes basées sur la documentation de Qt et des réponses semblables sur ce site en vain. Un nom d'objet est juste un QString, mais l'utiliser de cette façon ne fonctionne pas. J'ai également essayé d'utiliser findChildren, mais je ne comprends pas complètement la documentation sur cette fonction. Le résultat final est, j'ai une liste de QLabels dans ma boîte de dialogue pour laquelle je veux enregistrer le texte. J'ai utilisé la fonction saveLine ailleurs avec succès, mais j'obtiens les erreurs ci-dessus en essayant de référencer l'objet. Toute recommandation serait très utile. MISE À JOUR: J'ai réussi à corriger le problème pour qu'il ne renvoie aucune erreur, mais il ne renvoie toujours aucun résultat, donc je suppose que la question est plus ciblée maintenant à la méthode findChildren et comment la chaîne QString se traduit par un objectName. Voici le code mis à jour, mais il ne renvoie toujours aucun résultat.Comment référencer un objectName en utilisant un QString?

QList<QLabel *> labels = this->findChildren<QLabel *>("mylabel_"); 
for(int i = 0; i < labels.count(); i++) 
{ 
    QString labelText = labels.at(i)->text(); 
    functions::saveLine(&nameFile, labelText); 
} 

Donc, si je pouvais trouver toutes les étiquettes qui commencent par objectName = « mylabel_ », et les mettre dans un QList, ce serait en mesure de tirer le texte d'eux et de le transmettre à la Savéline fonction que j'ai implémentée. Cependant, je ne sais pas pourquoi il ne trouve pas les étiquettes basées sur QString que je mets en argument pour findChildren.

+0

Tout ne doit pas commencer par 'ui->'. Variables non locales – LogicStuff

+0

Votre liste contient-elle des étiquettes après l'exécution de findChildren? – vincent

+0

En outre, il serait utile de voir le code de dialogue. – vincent

Répondre

1

Si vos objets ne sont pas nommés exactement "mylabel_", je ne pense pas que cette fonction fonctionnera. Si vous souhaitez rechercher des libellés basés sur une expression régulière, vous devez utiliser la fonction QRegExp version de la fonction findChildren. Cela dit, vous pouvez toujours utiliser C++ normal pour indexer les objets par leur nom. La manière typique de faire ceci est avec une carte. Et c'est probablement similaire à ce que fait Qt sous les couvertures. Ce sera assez efficace si vous avez un ensemble d'objets connus du même type.

#include <map> 

... 

std::map<QString, QLabel*> { 
    { "myLabel0", label0 }, 
    { "myLabel1", label1 }, 
    { "myLabel2", label2 } 
}; 

... 

Si vous êtes intelligent, vous pouvez même stocker différents types en stockant un pointeur vers une classe de base commune ...

std::map<QString, QObject*> { 
    { "myLabel", label }, 
    { "myWidget", widget }, 
    { "myButton", button } 
}; 

Puisque vous obtenez l'objet par son nom, vous pouvez probablement se souvenir du type aussi. De the documentation, il semble que Qt fait cela, puis jette les objets au type que vous spécifiez. Upcasting a tendance à être un peu malodorant.

Toutefois, si vous n'avez pas besoin de stocker un grand nombre d'objets, vous pouvez sous-classer la boîte de dialogue, puis simplement stocker un pointeur sur l'étiquette dans une variable membre. C'est généralement une bonne idée de sous-classer. Cela pourrait rendre votre code plus réutilisable.

class MyDialog : public QDialog 
{ 
public: 
    ... 
    void addLabel(QLabel* label); 
    void saveLabelText(QLabel* label); 
    ... 
private: 
    ... 
    QLabel* _myLabel; 
    ... 
}; 
+0

La cartographie serait utile si j'avais besoin que les QLabels soient mappés à d'autres fins de référencement. Cependant, j'ai juste besoin de tirer le texte de chacun de ces groupes d'étiquettes. Je suppose que findChildren est la méthode la mieux adaptée à cette fin, mais en me basant sur la documentation, je ne suis pas certain de la mettre en œuvre correctement. –