Bonjour à tous ,

Pour un de mes cours ( de c++ ) je doit développer une fenêtre listant des objets, jusqu'ici tout vas bien.
Pour lister mon objet je l'encapsule dans ce que j’appelle un Module.
La classe module est simplement une QFrame comportant un nom et deux boutons, jusqu'ici tout vas bien.
Je récupère donc l'objet que je veux créer que j'encapsule dans mon Module.

Cependant, c'est à partir de la que ça ne vas plus trop bien , mon Module vas encapsuler des classes différentes. J'utilise donc une classe Template pour représenter mon module. Le problème c'est que un des boutons de mon module ouvre une fenêtre d'édition. Par conséquent dans mon module lorsqu'il y à pression sur le bouton d'edition je souhaiterai ouvrir l'Editeur correspondant à la classe passé à mon template.

J'ai trois erreur de compilation qui m'on amené à découvrir qu'on ne pourrait pas utiliser la Macro Q_Object dans une classe template.
Est-ce le cas ? Avez-vous un moyen pour contourner le problème ?

ListerTemplate.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#ifndef LISTERTEMPLATE_H
#define LISTERTEMPLATE_H
 
#include <QFrame>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QDialog>
 
template<class T>
class association{
public:
        typedef int Editor;
};
 
template<>
class association<UneClasse>{
public:
    typedef UneClasseEditeur Editeur;
};
 
//Classe permettant de créer un module encapsulant une classe
//pour ensuite permettre son affichage
//l'affichage est composé d'un texte de présentation ou titre
//ainsi que d'un bouton modifier et supprimer
 
//La classe necessite que la classe cible posséde une méthode toString()
//Ainsi qu'un Editeur déclaré dans l'association
 
template<class T>
class Module : public QFrame{
    Q_OBJECT
    T& m_toDraw; //Objet représenté dans le module
 
    QLabel* m_text; //Text représentant l'objet
 
    QPushButton* m_delete; //Bouton modifier et supprimer
    QPushButton* m_edit;
 
    QHBoxLayout* m_mainLayout; //Layout du widget
 
    unsigned int m_heightSizeButton;
    unsigned int m_weightSizeButton;
    unsigned int m_heightSize;
    unsigned int m_weightSize;
 
public :
    Module(T& toPrint,QWidget* Parent = 0, unsigned int weightSizeButton = 60, unsigned int heightSizeButton = 20, unsigned int weightSize = 560, unsigned int heightSize = 40):
        m_toDraw(toPrint),QFrame(Parent),m_weightSizeButton(weightSizeButton),m_heightSizeButton(heightSizeButton),m_heightSize(heightSize),m_weightSize(weightSize){
 
        setFrameShape (QFrame::StyledPanel);
 
        m_text = new QLabel(toPrint.toString());
        m_delete = new QPushButton("supprimer",this);
        m_edit = new QPushButton("modifier",this);
 
        m_mainLayout = new QHBoxLayout();
        m_mainLayout->addWidget (m_text);
        m_mainLayout->addWidget (m_delete);
        m_delete->setLayoutDirection (Qt::LeftToRight);
        m_delete->setFixedSize (m_weightSizeButton,m_heightSizeButton);
        m_mainLayout->addWidget (m_edit);
        m_edit->setLayoutDirection (Qt::LeftToRight);
        m_edit->setFixedSize (m_weightSizeButton,m_heightSizeButton);
        setFixedSize (m_weightSize,m_heightSize);
 
        setLayout (m_mainLayout);
        QObject::connect (m_edit,SIGNAL(clicked()),this,SLOT(modifier()));
    }
 
public slots:
 
    void modifier(){ //Slots du bouton modifier
 
        typename T::Editeur* dialog = new (typename T::Editeur)(m_toDraw);
        if (dialog->exec() == QDialog::Accepted) {
            }
    }
 
};
 
#endif // LISTERTEMPLATE_H
et le main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(int argc, char* argv[]) {
 
    QApplication app(argc, argv);
    Manager& m=Manager::getInstance();
    QString chemin = QFileDialog::getOpenFileName();
    m.load(chemin);
 
    UneClasse& objet=m.getUneClasse("toto");
    Module<UneClasse>* module = new Module<UneClasse>(objet);
    module->show();
 
    return app.exec();
 
}
les erreurs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
undefined reference to `Module<UV>::metaObject() const'
undefined reference to `Module<UV>::qt_metacast(char const*)'
undefined reference to `Module<UV>::qt_metacall(QMetaObject::Call, int, void**)'
Merci par avance