8
votes

Comment utiliser qmetamethod avec qObject :: connect

J'ai deux instances de sous-classes QOBJECT et de deux instances QMétamethod de signal dans l'un des objets et de la fente dans un autre objet. Je veux connecter ce signal et fente les uns avec les autres.

J'ai examiné le fichier qObject.h et trouver que le signal () et la macro () ajoutez simplement un caractère "1" ou "2" au début de la signature de la méthode afin qu'il semble qu'il soit possible de pouvoir être possible Ajoutez le même personnage au début de la chaîne renvoyée par QMeMethod :: Signature () Mais cette approche dépend de certains internes non documentés de boîte à outils et peut être cassé à tout moment par une nouvelle version de Qt.

Est-ce que quelqu'un connaît une manière fiable de connecter des signaux et des machines à sous à travers leur représentation de réflexion QMeMétameTethod?

édité: J'ai créé une suggestion dans QT Numéro Tracker: https://bugreports.qt.io/browse/qtbug-10637 Si quelqu'un s'intéresse également à cette fonctionnalité, vous pouvez voter pour ce billet.


0 commentaires

4 Réponses :


0
votes

Si la méthode de signature est publique dans QMeMethod, le résultat ne doit pas être brisé par des trolls et il est prudent de l'utiliser (la documentation ne dit rien sur «Dangers» lors de l'utilisation de QMeTameTethod :: Méthode de signature). Je pense que vous pouvez l'utiliser en toute sécurité. Juste pour être sûr, quelle version de Qt utilisez-vous en ce moment?


2 commentaires

pas exactement correct. Depuis dans QObject :: Connect Documentation, il est dit que le signal () et la macro de paramètres de fente () et de macro () doivent être utilisés, je ne peux pas simplement utiliser la fonction qmetaMethod :: signature (). La sortie de la macros diffère de qmetaMethod :: Signature () Sortie. Le pire dans cette situation que ces macros ne peuvent pas être utilisées avec des chaînes calculées en runtime.


Et j'utilise Qt 4.6.2 (dernière version disponible dans le référentiel officiel Ubuntu 10.04)



1
votes

On dirait qu'il n'ya aucun moyen de le faire fonctionner sans s'appuyer sur la mise en œuvre interne. Si j'étais vous, je soumettais une demande de fonctionnalité à tracker de bug Qt , écrivez un Code qui imite les macros de signal de comportement actuel / slot et ajoutez un test d'unité qui échouera lorsque les changements de comportement du signal / emplacement.

Il pourrait y avoir une solution plus simple au problème que vous essayez de résoudre: Décrivez ce que vous essayez exactement de faire sans détails de mise en œuvre.


2 commentaires

On dirait que tu as raison. Je vais essayer de demander à la liste de diffusion de QT-Intérêts et s'il n'y aura pas de réponse, je vais remplir une entrée de liste de souhaits.


J'ai des classes de proxy générées qui crée et envoie une demande RPC lorsque vous appelez la machine à sous et émet des signaux lors de la réception de la demande RPC sur le réseau (c'est ma propre petite bibliothèque OpenSource qRemotesInd.googlecode.com ). Je souhaite ajouter une fonction qui peut connecter automatiquement tous les signaux et emplacement partagés RPC en classe proxy avec des signaux et des emplacements de certaines catégories cible qui fonctionnent réellement dans une application utilisant cette bibliothèque.



19
votes

Ceci a été corrigé à partir de qt 4.8.0:

https: // bugReports. qt.io/browse/qtbug-10637 p>

Supposons que nous ayons un QObject * m_subject et souhaitez connecter le signal de notification de changement d'une propriété à une location de bien-être (): P >

const QMetaObject* meta = m_subject->metaObject();
QMetaProperty prop = meta->property(meta->indexOfProperty("myProperty"));
if (prop.hasNotifySignal()) {
    QMetaMethod signal = prop.notifySignal();
    QMetaMethod updateSlot = metaObject()->method(
        metaObject()->indexOfSlot("propertyChanged()"));
    connect(m_subject, signal, this, updateSlot);
}


2 commentaires

Oui, il a été corrigé par mon propre patch envoyé à Qt :)


Merci beaucoup. Aucun moyen plus simple d'obtenir métaméthod? Essayer d'implémenter le modèle MVC dans QT :) et c'est très utile.



1
votes

Merci à MBack, j'utilise maintenant des métaméthodes pour connecter ma vue sur les propriétés de mon modèle de manière dynamique pour le motif MVVM ou MVC. Afin de respecter sèche, une chaudière est requise avec quelque chose comme ceci:

 void MyClass::connectSignalToSlot(QObject* sender, std::string signalName, QObject* receiver, std::string slotName)
 {
    int sigIdx = sender->metaObject()->indexOfSignal(signalName.c_str());
    auto signal = sender->metaObject()->method(sigIdx);
    int slotIdx = receiver->metaObject()->indexOfSlot(slotName.c_str());
    auto slot = receiver->metaObject()->method(slotIdx);
    connect(sender,signal,receiver,slot);
 }

void MyClass::connectPropertyChangedToSlot(QObject* sender, std::string propName, QObject* receiver, std::string slotName)
{
   int sigIdx = sender->metaObject()->indexOfProperty(propName.c_str());
   auto signal = sender->metaObject()->property(sigIdx ).notifySignal();
   int slotIdx = receiver->metaObject()->indexOfSlot(slotName.c_str());
   auto slot = receiver->metaObject()->method(slotIdx);
   return connect(sender, signal, receiver, slot);
}


0 commentaires