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 :

Créer nouveaux signaux paramètres différents


Sujet :

Qt

  1. #1
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut Créer nouveaux signaux paramètres différents
    Bonjour,

    Un problème qui se pose souvant: j'ai un objet de la librairie Qt qui émet un signal avec un(des) argument(s) qui ne me convient(nent) pas. Je suis obbliger d'heriter de cet classe:

    Si on a une classe quelconque ClasseA qui possède un signal quelconque signalA(typeA) dans la librairie Qt. Je crée une classe ClasseB héritée de ClasseA. Je veux ajouter un signal signalB(typeB) à ClasseB. Ce signal doit se déclancher quand signalA est émit.

    J'ai une solution barbare:

    Je crée un nouveau slot slotB() dans ma ClasseB.
    Je connecte signalA à slotB comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(this,SIGNAL(signalA(typeA)),this,SLOT(slotB()));
    C'est possible nb arguments identiques slot <= nb arguments identiques signal

    Je définie slotB() comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void slotB(){
    typeB nouvelObjet;
    emit signalB(nouvelObjet);
    }
    En bref:

    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
    #include <ClasseA>
     
    class ClasseB : public ClasseA
    {
    public:
        Classe B():ClasseA()
        {
            connect(this,SIGNAL(signalA(typeA)),this,SLOT(slotB()));
        }
    signals:
        void signalB(typeB);
    private slots:
        void slotB()
        {
            typeB nouvelObjet;
            emit signalB(nouvelObjet);
        }
    }
    Y a-t-il de meilleurs méthodes?

  2. #2
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Non, pas à ma connaissance. Qt ne peut pas magiquement changer ton type

  3. #3
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Dommage, ça devient lourd quand on a plusieurs types de signaux.

  4. #4
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Tu es sûr de ne pas avoir de problème de conception? Tu peux donner un exemple type?

  5. #5
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    En fait je suppose que ça doit être lourd. Mais voilà un exemple:

    C'est une classe dérivée d'un QTreeWidget. Par défaut il y a un signal émit après un double clic sur un item avec comme argument un pointeur sur cet item. Mes items comprennent des noms des fichiers dans une colonne et des extensions dans l'autre.
    Moi je veux un signal qui, après double clic sur un item, prenne directement le nom du fichier contenu dans cet item en argument.

    En fait ma classe Tree (QTreeWidget) peut communiquer avec une classe qui s'occupe de gérer les fichiers et les ouvertures. Je veux qu'ils communiquent par des chaînes de caractères et non pas un type trop spécifique à mon goût à savoir les QTreeWidgetItem. Si j'ai le malheur de changer le format des items ça aurai une conséquence sur tous les autres objets qui utilisent le signal émettant un item. Alors qu'un nom de fichier en chaine de caractère est beaucoup plus standard pour échanger.

    tree.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
    #ifndef TREE_H
    #define TREE_H
     
    #include <QTreeWidget>
    #include <QList>
    #include <QTreeWidgetItem>
     
    class Tree : public QTreeWidget
    {
        Q_OBJECT
    public:
        Tree(QWidget* parent = 0);
        QList<QTreeWidgetItem*> itemsList();
    signals:
        void fileOpenRequest(QString&);
    protected slots:
        void m_itemDoubleClicked(QTreeWidgetItem*);
    private:
        QList<QTreeWidgetItem*> items;
    };
     
    #endif // TREE_H
    tree.cpp
    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
    #include <QString>
    #include "tree.h"
     
    Tree::Tree(QWidget* parent) : QTreeWidget(parent)
    {
        connect(this,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
                this,SLOT(m_itemDoubleClicked(QTreeWidgetItem*)));
     
    }
     
    QList<QTreeWidgetItem*> Tree::itemsList()
    {
        return items;
    }
     
    void Tree::m_itemDoubleClicked(QTreeWidgetItem* item)
    {
        QString fileName;
     
        fileName.append(item->text(0));
        fileName.append(".");
        fileName.append(item->text(1));
     
        emit fileOpenRequest(fileName);
    }

  6. #6
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Ok, dans ce cas tu as déjà trouvé la solution la plus propre, à savoir encapsuler ce comportement spécifique dans une classe dérivée de ton widget

  7. #7
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    D'accord ça me rassure alors. Merci pour ton aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Paramètres différents en fonction d'une variable
    Par worldchampion57 dans le forum Struts 2
    Réponses: 4
    Dernier message: 09/01/2008, 11h41
  2. créer un événement paramétrable
    Par gmanouvrier dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/11/2007, 10h47
  3. Comment créer une requête paramétrée ?
    Par tofke dans le forum SQL
    Réponses: 7
    Dernier message: 30/07/2007, 17h27
  4. [SQL2K] Créer une vue paramétrée ?
    Par andlio dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/06/2007, 16h51
  5. Réponses: 11
    Dernier message: 23/08/2005, 10h04

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