2010-11-21 5 views
10

Dans mon application, j'ai la hiérarchie de classe suivante:Est-il possible de mélanger des classes C++ dérivées de modèles avec Q_OBJECT de Qt?

class Word 
{ 
    ... 
} 

template <typename T> class Dictionary 
{ 
    ... 
}; 

class WordDictionary : public Dictionary<Word> 
{ 
    Q_OBJECT 

    ... 
} 

La classe WordDictionary parse un dictionnaire qui prend beaucoup de temps. J'exécute la fonction d'analyse à partir d'un thread distinct et je veux qu'il soit capable de signaler le thread graphique de temps en temps pour fournir des mises à jour de progression basées sur le numéro de ligne en cours d'analyse. C'est pourquoi je veux que ce soit un Q_OBJECT. J'ai essayé de faire du dictionnaire de classe de base un Q_OBJECT mais j'ai reçu un message indiquant que les templates Q_OBJECT ne sont pas supportés. Lorsque j'ai enlevé la macro, ne laissant que WordDictionary comme Q_OBJECT, je reçois un tas de messages d'erreur de la forme générale:

\ GeneratedFiles \ Release \ moc_dictionary.cpp (44):. Erreur C2039: 'staticMetaObject': est pas membre du « Dictionnaire »
avec
[
T = Mot
]

est-ce que je peux faire pour ma classe WordDictionary dérivée modèle-un Q_OBJECT autre que hardcoding les fonctions de modèle dans côté, produisant beaucoup de code standard?

modifier: Modification de la déclaration de modèle à:

template <typename T> class Dictionary : public QObject 

fait la compilation de code. Je ne suis pas sûr si je ne fais pas quelque chose de stupide et si cela fonctionnera correctement, cependant.

+0

[Pourquoi Qt n'utilise-t-il pas de modèles pour les signaux et les emplacements] (http://qt-project.org/doc/qt-4.8/templates.html) –

Répondre

14

Vous ne pouvez pas faire cela directement, mais il y a des tours de travail utilisables. Voir l'article here.

Bien qu'il soit théoriquement possible moc manipuler des modèles, il serait extrêmement complexe à mettre en œuvre, et serait très peu pratique à utiliser: Pour chaque instanciation de modèle, moc devrait générer le approprié le code méta-objet, et le produit code devrait être inclus une fois par unité de lien --- qui devient un cauchemar pour maintenir une fois un modèle classe est utilisée avec le même paramètre modèle dans différents compilation unités.

Si les signaux et slots ne nécessitent pas le paramètre de modèle pour faire partie de le prototype, la solution consiste à faire une classe de modèle héritera une sous-classe QObject qui fournit les signaux et créneaux horaires nécessaires. Si les signaux et les emplacements doivent utiliser les paramètres du modèle , le modèle Observer est une alternative.

2

Je viens d'essayer ce code et il compile et fonctionne ok:

#include <QtCore/QCoreApplication> 
#include <QObject> 

class Word 
{ 

}; 

template <typename T> class Dictionary 
{ 

}; 

class WordDictionary : public Dictionary<Word>, QObject 
{ 
    Q_OBJECT 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    WordDictionary wd(); 
    return a.exec(); 
} 

Peut être je manque quelque chose?

+0

Cela peut créer des problèmes sur toute la ligne, consultez l'article J'ai cité pour une discussion. –

+0

@Steve: Quels problèmes sur toute la ligne? L'article cité ne traite que d'essayer de dériver un modèle de classe à partir d'un objet QObject. Cela dérive une classe d'une instance de modèle et d'un QObject. Le seul problème que je vois avec ceci est que QObject devrait être le premier dans la liste d'héritage puisque moc suppose que la première classe héritée est une sous-classe de QObject. – baysmith

+3

QObject ne devrait-il pas être la première classe de base? – zarzych

Questions connexes