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 :

Redéfinition d'une méthode de QComboBox


Sujet :

Qt

  1. #1
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut Redéfinition d'une méthode de QComboBox
    Bonjour,

    je souhaiterais redéfinir showPopup de QComboBox.
    Pour cela, j'hérite et je redéfinit. Seulement ensuite, on ne peut pas réutiliser le code existant de QComboBox::showPopup(), or je souhaite juste ajouter une seule ligne au code existant...comment faire ?

    Actuellement, plus concrètement, si je met tout en commentaire sauf les quelques premières lignes j'obtiens des erreurs à la compilation telles que:
    mycombobox.cpp: In member function `virtual void MyComboBox::showPopup()':
    error: `QComboBoxPrivate* QComboBox::d_func()' is private
    mycombobox.cpp:24: error: within this context
    mycombobox.cpp:31: error: invalid use of undefined type `struct QAbstractItemView'
    d:/Outils/Qt/qt/qt/include/QtGui/../../src/gui/itemviews/qabstractitemdelegate.h:59: error: forward declaration of `struct QAbstractItemView'
    mycombobox.cpp:31: error: invalid use of undefined type `struct QComboBoxPrivate'
    ...
    Comment faire pour redéfinir correctement une méthode d'un composant Qt en réutilisant son code ???

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Pourquoi ne pas tout simplement hériter de QComboBox (comme tu le fais déjà) et appeler QComboBox::showPopup() dans MyComboBox::showPopup() ?

  3. #3
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    Ton erreur d'accessibilité ne viendrait pas d'un héritage non public, ou de la surdéfinition en private d'un élément protected ou public?

    On peut avoir un peu de code?

    Comme le dit Alp, tu peux faire appel à QComboBox::showPopup() dans ta classe perso et ajouter ta ligne où tu le souhaites.
    Un clavier Azerty en vaut deux.

  4. #4
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Voici le code

    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
     
    #include <QComboBox>
    class MyComboBox : public QComboBox
    {
    public:
        MyComboBox (QWidget *parent);
        virtual void showPopup();
    };
     
    MyComboBox::MyComboBox(QWidget *parent)
        : QComboBox(parent)
    {
    }
     
    /*!
        Displays the list of items in the combobox. If the list is empty
        then the no items will be shown.
        If you reimplement this function to show a custom pop-up, make
        sure you call hidePopup() to reset the internal state.
    */
    void MyComboBox::showPopup()
    {
        Q_D(QComboBox);
        if (count() <= 0)
            return;
     
        QStyle * const style = this->style();
     
        view()->selectionModel()->setCurrentIndex(d->currentIndex,
                                                  QItemSelectionModel::ClearAndSelect);
        QComboBoxPrivateContainer* container = d->viewContainer();
     
     
    /*
    ...
    Je n'ai même pas essayé le reste encore
     
    Dans la suite je veux par exemple reutiliser le code pour modifier et placer l'affichage donnée à un autre endroit, par ex (en attendant de faire mieux): 
    container->move(container->x(), container->y()-listRect.height()/2);
    */
    La 1ere ligne Q_D(QComboBox) bloque directement, effectivement sur problème de private ...

    Je voudrais bien appeler uniquement showPopup mais en fait comme je veux modifier directement le code source, je le remet dans ma méthode...


  5. #5
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    A quoi correspond la ligne Q_D(QComboBox); ?

    la macro Q_OBJECT n'est pas appelée, c'est normal?
    Un clavier Azerty en vaut deux.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Je dis ça au hasard, mais ça pourrait être une piste :

    Ne peux tu pas redéfinir showPopup() et dedans tu fait un painter.translate puis tu appelles le showPopup de QComboBox ?

    Y'a une méthode statique dans QPainter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QPaintDevice * QPainter::redirected ( const QPaintDevice * device, QPoint * offset = 0 )
    Je sais pas trop comment s'en servir et si elle peut faire ce que tu veux, c'est juste une piste.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  7. #7
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Ou alors je pourrais simplement redéfinir en créant mon propre QListWidget et afficher sa vue là où je veux et sinon appeler par défaut ShowPopup() ... ?!


    PS :
    à Ryo2468 : la ligne Q_D(QComboBox), c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define Q_D(Class) Class##Private * const d = d_func()
    cela crée un objet "d" qui en fait permet d'accéder à toutes les données privées, du genre le container, les items selectionnés etc...il est assez utile je pense

    à Gulish : ... oui c'est une idée...je testerai ça !

    Mon but par la suite ça serait de couper en deux la vue en en mettant en haut du bouton et en bas...

  8. #8
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    Justement, je ne comprends pas du tout à quoi ça te sert, puisque ta classe hérite directement de QComboBox :o
    Un clavier Azerty en vaut deux.

  9. #9
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Il m'a suffit d'utiliser la vue et de la déplacer...
    je cherchais à faire trop compliqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void MyComboBox::showPopup()
    {
        view()->move(view()->x(), view()->y() - view()->height()/2);
        QComboBox::showPopup();
    }

    Merci à vous !!!

    ------------------
    Mon sujet est résolu...mais je souhaiterais utiliser la méthode QWidget::render() qui donne le rendu du widget...le problème c'est que le rendu ne prend pas en compte les items du widget.

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

Discussions similaires

  1. [XML] Redéfinition d'une méthode de minidom
    Par Rupella dans le forum Général Python
    Réponses: 3
    Dernier message: 23/09/2009, 15h43
  2. Réponses: 4
    Dernier message: 25/03/2009, 15h18
  3. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35
  4. Réponses: 3
    Dernier message: 16/04/2004, 16h51
  5. une méthode qui écrit dans la sortie html ?
    Par iubito dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/12/2003, 15h34

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