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

Discussion :

Récupération de la longueur d'intervalle en pixels d'un QSlider

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut Récupération de la longueur d'intervalle en pixels d'un QSlider
    Bonjour,

    Je cherche à récupérer la longueur d'intervalle d'un QSlider en pixel sachant que celui-ci peut changer de size (par agrandissement / rétrécissement de la fenêtre parente).

    Pourquoi ? Mon but est de pouvoir afficher de petites icônes dans un QWidget situé juste en dessous du QSlider, à une position qui est exactement la même que celle du curseur du QSlider. Autrement dit, à chaque fois que le curseur bouge une image est placée juste en dessous de la position d'avant.

    Actuellement, voici ce que je fais mais il y a malheureusement un décalage par rapport au QSlider :

    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
     
     
    // slider est de type QSlider * dans MaClasse
     
    void MaClasse::paintEvent(QPaintEvent * event)
    {
        QPainter painter(this);
        QStyleOptionGraphicsItem option;
        int marge = 11; // Marge entre le bord de slider et le premier Tick du slider, je fournis la valeur car je n'ai pas vu comment l'obtenir directement
        int pasSlider2 = (slider()->width() - 2 * marge ) / slider()->maximum(); // largeur du slider calculée mais qui me semble pas valide vu le décalage. J'ai retranché les marges de droite et de gauche !!
        for (int i=0; i<slider()->maximum(); i++)
        {
            QGraphicsLineItem line(QLineF(QPointF(marge + i*pasSlider2, (i%2==0 ? 2 : 5)),
                                          QPointF(marge+(i+1)*pasSlider2, (i%2==0 ? 2 : 5))));
            line.paint(&painter, &option);
        }
    }
    Bien entendu, ici je n'affiche pas des images mais c'est pas important. Les lignes tracées ne coïncident pas exactement avec les Ticks et c'est là le problème !

    Merci pour toute aide !

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Tu peux récupérer le QRect correspondant au curseur en passant par QStyle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    QStyleOptionSlider opt;
    slider->initStyleOption(&opt);
    QRect handleRect = slider->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
     
    // pour avoir la position x en pixels (cas d'un slider horizontal)
    int position_relative = handleRect.x() + handleRect.width() / 2;
    int position_absolue = position_relative + slider->pos().x();

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Bonjour

    Tu peux récupérer le QRect correspondant au curseur en passant par QStyle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    QStyleOptionSlider opt;
    slider->initStyleOption(&opt);
    QRect handleRect = slider->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
     
    // pour avoir la position x en pixels (cas d'un slider horizontal)
    int position_relative = handleRect.x() + handleRect.width() / 2;
    int position_absolue = position_relative + slider->pos().x();
    Merci pour ta réponse. je reviens vers toi dès que je teste !

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut
    Au fait, j'ai tenté d'intégrer ton code mais je ne vois pas comment cela peut me fournir la largeur entre deux postions du slider ? Je m'explique : supposons que le slider soit ainsi :

    --|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|--

    je veux pouvoir connaitre la valeur de ça : |----| en pixel sachant que ça varie en fonction d'événement resize ?

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Voila un parfait exemple où je répond complètement à côté de la plaque
    Le code que je t'ai donné permet de récupérer la position du curseur en pixel et ne sert à rien pour ta question.

    Pour répondre (j'espère) à ta question, il faut quand même utiliser QStyle mais avec la fonction pixelMetric avec les paramètres PM_Slider. Le mieux est de s'inspirer directement du code de Qt (par exemple de QWindowsStyle). Tu auras le code d'affichage (et donc de calcul) des ticks ici (et voir en particulier la boucle while à partir de la ligne 2744 )

    En espérant avoir enfin répondu correctement

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut
    Alors là c'est parti pour très bonne longue lecture . Je vais checker ça !

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut
    J'ai pu reprendre une grande partie du code Qt mais sans effets escomptés !
    Mais j'aimerais quand même savoir pourquoi un truc ne marche pas :
    J'ai un slider et un widget juste en dessous et ils ont tous les deux la même largeur à l'ouverture de la fenêtre principale.

    - La largeur entre deux ticks est donc calculée comme suit : slider.width() / slider.maximum() ou encore (slider.width() - 2*marge) / slider.maximum où marge vaut 11. Dès que j'agrandis la fenêtre ce rapport est faussé, mais initialement c'est ok. Pourquoi ?

    Merci.

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut
    Bonjour,

    Voici le code source de Qt que j'ai réadapté à mes besoins. Seulement, ça ne marche toujours pas (obtention des lignes horizontales au même niveau que chaque intervalle du slider. Qu'est ce qui cloche ?

    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
     
        int tickOffset = slider->style()->pixelMetric(QStyle::PM_SliderTickmarkOffset);
        int thickness = slider->style()->pixelMetric(QStyle::PM_SliderControlThickness);
        int len = slider->style()->pixelMetric(QStyle::PM_SliderLength);
        int available = slider->style()->pixelMetric(QStyle::PM_SliderSpaceAvailable);
        int interval = slider->tickInterval();
        if (interval <= 0) {
            interval = slider->singleStep();
            if (QStyle::sliderPositionFromValue(slider->minimum(), slider->maximum(), interval, available)
                - QStyle::sliderPositionFromValue(slider->minimum(), slider->maximum(), 0, available) < 3)
            interval = slider->pageStep();
        }
        if (!interval)
            interval = 1;
        int fudge = len / 2;
        int pos;
        int bothOffset = 1;
     
        int v = slider->minimum();
        int i=0;
        while (v <= slider->maximum() + 1) {
            if (v == slider->maximum() + 1 && interval == 1)
                break;
            const int v_ = qMin(v, slider->maximum());
            int tickLength = (v_ == slider->minimum() || v_ >= slider->maximum()) ? 4 : 3;
            pos = QStyle::sliderPositionFromValue(slider->minimum(), slider->maximum(),
                                                  v_, slider->width()) + fudge;
     
            QGraphicsLineItem line(QLineF(QPointF(pos, (i%2==0 ? 2 : 5)),
                                          QPointF(pos +
                                                  QStyle::sliderPositionFromValue(slider->minimum(), slider->maximum(), thickness, slider->maximum()),
                                                  (i%2==0 ? 2 : 5))));
            line.paint(&painter, &option);
            i++;
     
            // in the case where maximum is max int
            int nextInterval = v + interval;
            qWarning() << "nextInterval = " << nextInterval;
            if (nextInterval < v)
                break;
            v = nextInterval;
        }

Discussions similaires

  1. Récupération d'une image sous forme de pixels
    Par chekchouka dans le forum Débuter
    Réponses: 3
    Dernier message: 06/02/2011, 21h38
  2. Réponses: 2
    Dernier message: 11/07/2006, 14h52
  3. Récupération de la couleur d'un pixel
    Par optalix dans le forum DirectX
    Réponses: 3
    Dernier message: 05/04/2006, 18h26
  4. Réponses: 6
    Dernier message: 06/10/2005, 16h02
  5. Longueur d'une string et nombre de pixels correspondant
    Par Alex Laforest dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2005, 09h22

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