IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

[class template] gestion d'élement QWidget


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut [class template] gestion d'élement QWidget
    Bonjour,

    Je suis entrain d'essayer de créer une classe template pouvant stocker n'importe quel type de widget par exemple, QPushButton, QComboBox, QCheckBox ...

    Mon soucis, c'est que je n'arrive pas à récupérer les signaux que ces widgets peuvent envoyer.
    Mais le peux t'on vraiment ???

    Pour contourner le fait que le système de signal/slot n'est pas géré lorsqu'on part d'une classe template, j'ai découpé mon code en 2 une première partie qui fait la gestion du template et la seconde en classe de base qui gère les signaux et slots.


    La classe template :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    #ifndef ELEMENT_H
    #define ELEMENT_H
     
    #include "SignalSlotBase.h"
     
    #include <QWidget>
    #include <QLabel>
    #include <QHBoxLayout>
    #include <QVBoxLayout>
    #include <QMouseEvent>
    #include <QVariant>
     
    template<typename T>
    class Element : public QWidget, public SignalSlotBase
    {
    public:
        enum class ePosition { TOP, BOTTOM, LEFT, RIGHT };
     
        explicit Element(T info, QString titre = "", QWidget *parent = Q_NULLPTR);
     
        ePosition positionLabel() const { return m_positionLabel; }
        void setPositionLabel(const ePosition &positionLabel);
        T* info() const { return m_info; }
        void setInfo(T info) { m_info = info; }
        QLabel *label() const{ return m_label; }
        void setLabel(QLabel *label){ if( label != Q_NULLPTR) m_label = label; }
     
    protected:
        void mouseReleaseEvent(QMouseEvent *event);
     
     
    public slots:
     
     
    private:
        void initPositionLabel();
     
        T           m_info          ;
        QLabel*     m_label         ;
        ePosition   m_positionLabel ;
     
    };
    //template<typename T>
    //Q_DECLARE_METATYPE(Element<T>::ePosition)
     
     
    #endif // ELEMENT_H
     
     
    template<typename T>
    Element<T>::Element(T info, QString titre, QWidget *parent)
        : QWidget(parent)
        , m_info( info )
        , m_label( new QLabel(titre, this) )
        , m_positionLabel( Element<T>::ePosition::LEFT )
    {
        initPositionLabel();
    }
     
    template<typename T>
    void Element<T>::setPositionLabel(const ePosition &position) {
        if( position != m_positionLabel)
            m_positionLabel = position;
     
        initPositionLabel();
    }
     
    template<typename T>
    void Element<T>::initPositionLabel() {
        QBoxLayout* layout;
     
        switch (m_positionLabel) {
        case ePosition::LEFT:
            layout = new QHBoxLayout(this);
            layout->addWidget(m_label, 1, Qt::AlignRight);
            layout->addWidget(m_info, 1);
            break;
        case ePosition::RIGHT:
            layout = new QHBoxLayout(this);
            layout->addWidget(m_info, 1);
            layout->addWidget(m_label, 1, Qt::AlignLeft);
            break;
        case ePosition::TOP:
            layout = new QVBoxLayout(this);
            layout->addWidget(m_label, 1, Qt::AlignCenter);
            layout->addWidget(m_info, 1);
            break;
        case ePosition::BOTTOM:
            layout = new QVBoxLayout(this);
            layout->addWidget(m_info, 1);
            layout->addWidget(m_label, 1, Qt::AlignCenter);
            break;
        default:
            break;
        }
     
        setLayout(layout);
    }
     
    template<typename T>
    void Element<T>::mouseReleaseEvent(QMouseEvent *event) {
        Q_UNUSED(event)
        emit elementClicked(QVariant(this));
    }
    la classe de base
    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
     
    #include <QObject>
     
    class SignalSlotBase : public QObject
    {
        Q_OBJECT
     
    signals:
        void elementClicked(QVariant element);
     
     
    public slots:
    //    virtual void slotElementClicked(QVariant element) = 0;
     
     
    };
    Ma classe .h d'appel:
    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
     
    #include "Utility/Element.h"
     
    #include <QMainWindow>
    #include <QObject>
    #include <QPushButton>
    #include <QVariant>
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = Q_NULLPTR);
        ~MainWindow();
     
    signals:
     
     
    public slots:
        template<typename T>
        void traitementElement(QVariant element);
     
    private:
        Element<QPushButton*>* m_test;
     
    };
    Ma classe cpp d'appel :
    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
     
    #include "MainWindow.h"
     
    #include <QDebug>
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
     
        setGeometry(200,150,800,600);
     
        m_test = new Element<QPushButton*>(new QPushButton(this), "Test de QPushButton", parent);
        m_test->label();
        QObject::connect(m_test, &Element<QPushButton*>::elementClicked, this, &MainWindow::traitementElement );
     
        setCentralWidget(m_test);
     
    }
     
    MainWindow::~MainWindow()
    {
        if( m_test != Q_NULLPTR )
            delete m_test;
    }
     
    template<typename T>
    void MainWindow::traitementElement(QVariant element)
    {
        qDebug() << "je passe par le slot de test";
        Element<QPushButton*> sender = element.value<Element<QPushButton*>>();
     
        if (sender.info()->isChecked() ) {
            qDebug() << "Le bouton a été clické";
        } else {
            qDebug() << "Le bouton n'a pas été clické";
        }
     
    }
    Les erreurs remontées :
    F:\Projets\TestElementWidget\MainWindow.cpp: In constructor 'MainWindow::MainWindow(QWidget*)':
    F:\Projets\TestElementWidget\MainWindow.cpp:13:107: error: no matching function for call to 'MainWindow::connect(Element<QPushButton*>*&, void (SignalSlotBase::*)(QVariant), MainWindow* const, <unresolved overloaded function type>)'
    QObject::connect(m_test, &Element<QPushButton*>::elementClicked, this, &MainWindow::traitementElement );
    ^
    F:\Projets\TestElementWidget\MainWindow.cpp:13:107: note: candidates are:
    In file included from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/QObject:1:0,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/SignalSlotBase.h:4,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:4,
    from F:\Projets\TestElementWidget\MainWindow.h:4,
    from F:\Projets\TestElementWidget\MainWindow.cpp:1:
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:198:36: note: static QMetaObject::Connection QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
    static QMetaObject::Connection connect(const QObject *sender, const char *signal,
    ^
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:198:36: note: no known conversion for argument 2 from 'void (SignalSlotBase::*)(QVariant)' to 'const char*'
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:201:36: note: static QMetaObject::Connection QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
    static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,
    ^
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:201:36: note: no known conversion for argument 2 from 'void (SignalSlotBase::*)(QVariant)' to 'const QMetaMethod&'
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:479:32: note: QMetaObject::Connection QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
    inline QMetaObject::Connection QObject::connect(const QObject *asender, const char *asignal,
    ^
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:479:32: note: no known conversion for argument 2 from 'void (SignalSlotBase::*)(QVariant)' to 'const char*'
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:215:43: note: static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType) [with Func1 = void (SignalSlotBase::*)(QVariant); Func2 = void (MainWindow::*)(QVariant); typename QtPrivate::FunctionPointer<Func>::Object = SignalSlotBase; typename QtPrivate::FunctionPointer<Func2>::Object = MainWindow]
    static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
    ^
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:215:43: note: no known conversion for argument 4 from '<unresolved overloaded function type>' to 'void (MainWindow::*)(QVariant)'
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:247:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2)
    connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)
    ^
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:247:13: note: template argument deduction/substitution failed:
    F:\Projets\TestElementWidget\MainWindow.cpp:13:107: note: candidate expects 3 arguments, 4 provided
    QObject::connect(m_test, &Element<QPushButton*>::elementClicked, this, &MainWindow::traitementElement );
    ^
    In file included from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/QObject:1:0,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/SignalSlotBase.h:4,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:4,
    from F:\Projets\TestElementWidget\MainWindow.h:4,
    from F:\Projets\TestElementWidget\MainWindow.cpp:1:
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:256:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0) && (! QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType)
    connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
    ^
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:256:13: note: template argument deduction/substitution failed:
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h: In substitution of 'template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0) && (! QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) [with Func1 = void (SignalSlotBase::*)(QVariant); Func2 = void (MainWindow::*)(QVariant)]':
    F:\Projets\TestElementWidget\MainWindow.cpp:13:107: required from here
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:256:13: error: invalid use of incomplete type 'struct QtPrivate::QEnableIf<false, QMetaObject::Connection>'
    Makefile.Debug:447: recipe for target 'debug/MainWindow.o' failed
    In file included from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include/QtCore/qnamespace.h:45:0,
    from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include/QtCore/qobjectdefs.h:49,
    from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:48,
    from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/QObject:1,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/SignalSlotBase.h:4,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:4,
    from F:\Projets\TestElementWidget\MainWindow.h:4,
    from F:\Projets\TestElementWidget\MainWindow.cpp:1:
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include/QtCore/qglobal.h:1040:45: error: declaration of 'struct QtPrivate::QEnableIf<false, QMetaObject::Connection>'
    template <bool B, typename T = void> struct QEnableIf;
    ^
    In file included from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/QObject:1:0,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/SignalSlotBase.h:4,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:4,
    from F:\Projets\TestElementWidget\MainWindow.h:4,
    from F:\Projets\TestElementWidget\MainWindow.cpp:1:
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:287:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2)
    connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)
    ^
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:287:13: note: template argument deduction/substitution failed:
    F:\Projets\TestElementWidget\MainWindow.cpp:13:107: note: candidate expects 3 arguments, 4 provided
    QObject::connect(m_test, &Element<QPushButton*>::elementClicked, this, &MainWindow::traitementElement );
    ^
    In file included from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/QObject:1:0,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/SignalSlotBase.h:4,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:4,
    from F:\Projets\TestElementWidget\MainWindow.h:4,
    from F:\Projets\TestElementWidget\MainWindow.cpp:1:
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:295:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType)
    connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
    ^
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:295:13: note: template argument deduction/substitution failed:
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h: In substitution of 'template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) [with Func1 = void (SignalSlotBase::*)(QVariant); Func2 = void (MainWindow::*)(QVariant)]':
    F:\Projets\TestElementWidget\MainWindow.cpp:13:107: required from here
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:295:13: error: invalid use of incomplete type 'struct QtPrivate::QEnableIf<false, QMetaObject::Connection>'
    In file included from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include/QtCore/qnamespace.h:45:0,
    from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include/QtCore/qobjectdefs.h:49,
    from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/qobject.h:48,
    from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore/QObject:1,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/SignalSlotBase.h:4,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:4,
    from F:\Projets\TestElementWidget\MainWindow.h:4,
    from F:\Projets\TestElementWidget\MainWindow.cpp:1:
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include/QtCore/qglobal.h:1040:45: error: declaration of 'struct QtPrivate::QEnableIf<false, QMetaObject::Connection>'
    template <bool B, typename T = void> struct QEnableIf;
    ^
    F:\Projets\TestElementWidget\MainWindow.cpp: In member function 'void MainWindow::traitementElement(QVariant)':
    F:\Projets\TestElementWidget\MainWindow.cpp:31:24: error: request for member 'isChecked' in 'sender.Element<T>::info<QPushButton*>()->', which is of pointer type 'QPushButton*' (maybe you meant to use '->' ?)
    if (sender.info()->isChecked() ) {
    ^
    mingw32-make[1]: Leaving directory 'D:/Dev/Build/TestElement'
    Makefile:34: recipe for target 'debug' failed
    In file included from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtGui/qevent.h:52:0,
    from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtGui/QMouseEvent:1,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:10,
    from F:\Projets\TestElementWidget\MainWindow.h:4,
    from F:\Projets\TestElementWidget\MainWindow.cpp:1:
    F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h: In instantiation of 'void Element<T>::mouseReleaseEvent(QMouseEvent*) [with T = QPushButton*]':
    F:\Projets\TestElementWidget\MainWindow.cpp:37:1: required from here
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include/QtCore/qvariant.h:466:12: error: 'QVariant::QVariant(void*)' is private
    inline QVariant(void *) Q_DECL_EQ_DELETE;
    ^
    In file included from F:\Projets\TestElementWidget\MainWindow.h:4:0,
    from F:\Projets\TestElementWidget\MainWindow.cpp:1:
    F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:103:10: error: within this context
    emit elementClicked(QVariant(this));
    ^
    F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:103:10: error: use of deleted function 'QVariant::QVariant(void*)'
    In file included from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtGui/qevent.h:52:0,
    from ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include\QtGui/QMouseEvent:1,
    from F:\Projets\TestElementWidget\../WIN9010/Utility/Element.h:10,
    from F:\Projets\TestElementWidget\MainWindow.h:4,
    from F:\Projets\TestElementWidget\MainWindow.cpp:1:
    ..\..\..\Soft\Qt\Qt5.3.2\5.3\mingw482_32\include/QtCore/qvariant.h:466:12: error: declared here
    inline QVariant(void *) Q_DECL_EQ_DELETE;
    ^
    mingw32-make[1]: *** [debug/MainWindow.o] Error 1
    mingw32-make: *** [debug] Error 2
    11:50:00: Le processus "D:\Soft\Qt\Qt5.3.2\Tools\mingw482_32\bin\mingw32-make.exe" s'est terminé avec le code 2.
    Erreur lors de la compilation/déploiement du projet TestElementWidget (kit : Desktop Qt 5.3 MinGW 32bit)
    When executing step "Make"
    11:50:00: Temps écoulé : 00:07.
    Bon, je n'ai pas forcement que des erreurs de signal/slot mais, je ne m'en sors pas et c'est pour cela que je vous sollicite.

    Merci d'avance.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 604
    Points
    188 604
    Par défaut


    Déjà, pourquoi as-tu un tel besoin ? Que cherches-tu à faire avec ce moyen ? Il y a peut-être des solutions plus simples à ton vrai problème plutôt que des solutions compliquées pour cette affaire de signaux.

    Pourquoi utiliser un template ? Ne peux-tu pas stocker un QWidget à la place ? Sinon, ne peux-tu pas spécialiser le template pour chaque type que tu souhaites utiliser (vu que tu devras toujours avoir un peu de code spécifique pour le signal spécifique à appeler) ?

    Une autre approche pourrait se faire à l'exécution, en observant la liste des signaux d'un QWidget à travers son QMetaObject et sa méthode method() (https://doc.qt.io/qt-6/qmetaobject.html#method).

    Ton erreur indique que QVariant n'est pas un QObject et ne peut pas émettre de signal. Par contre, n'importe quel QWidget est un QObject et peut émettre des signaux.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Bonjour, merci de m'avoir répondu.

    J'ai une multitude de QPushbutton, de QCheckBox, de QComboBox etc à afficher chacun étant associé a un QLabel.

    Au départ, j'ai construit une structure avec un QLabel (qui lui ne change pas de type) et un QMap de QWidget.
    Cette solution me paraissait pas mal mais dès que je veux modifier l'instance de mon objet, il faut faire un cast systématique. cela devient vite verbeux quand on en a beaucoup.

    Du coup, j'ai pensé au template avec tous les problèmes lié a cette méthode.
    Je vais jeter un coup d'oeil sur le metaObject

    Mais je suis ouvert à toute autre solution si il y a mieux

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 604
    Points
    188 604
    Par défaut
    Tu peux concevoir ton interface avec Qt Designer et profiter du code généré, c'est une approche assez classique et sans transtypage. Par exemple, c'est ce que LyX fait, y compris pour les paramètres (alors qu'il y a littéralement des centaines de paires label-widget, si pas des milliers) : https://github.com/cburschka/lyx/blo...ui/OutputUi.ui et https://github.com/cburschka/lyx/blo.../GuiDocument.h, par exemple.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Effectivement, j'aurais peut être pu passer par le Qt Designer, le problème avec ça, c'est que je suis sur un projet legacy qu'il faut faire évoluer en ajoutant des pages de paramètres pour de nouvelles normes.
    Ce projet n'a pas été conçu a partir du Qt Designer

    J'essaie de le faire évolué mais il y a de la résistance

    Finalement, je suis revenu à ma structure pour le moment mais je garde sous le coude la solution du QMetaObject::method. Il faut que je la travaille, ça me servira probablement pour d'autre projets.

    Merci d'avoir passé du temps

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 604
    Points
    188 604
    Par défaut
    Tu peux tenter une migration morceau par morceau. L'exemple de LyX que j'ai donné utilise un fichier Qt Designer par page de paramètres, ce que tu pourrais peut-être répliquer pour faire une transition progressive. (Sinon, tu tentes un passage progressif à Qt Quick et QML, là, tu risques d'avoir une vraie résistance !)
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

Discussions similaires

  1. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56
  2. Class template hérité
    Par Azharis dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2005, 22h03
  3. Classe de gestion des images
    Par tlemcenvisit dans le forum MFC
    Réponses: 2
    Dernier message: 03/05/2005, 19h07
  4. Class de gestion des images avec rotation
    Par Johnny Boy dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2005, 11h54
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo