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 :

Augmentation d'incrément d'un spinbox


Sujet :

Qt

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 65
    Points
    65
    Par défaut Augmentation d'incrément d'un spinbox
    Lorsqu'on utilise les touches haut et bas du clavier pour changer la valeur d'un QSpinBox, la valeur augmente de singleStep(). Y a t'il une option du QSpinBox de telle manière d'augmenter la valeur d'incrémentation lorsqu'on appuie sur shift en même temps ? (Ex: multiplié par 10 l'incrément)

  2. #2
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Selon la doc on peut modifier le comportement de l'incrémentation en surchargeant cette fonction virtuelle http://qt.developpez.com/doc/4.7/qab...pinbox/#stepby
    Et elle semble déjà avoir un comportement par défaut qui peut varier selon les touches :
    Pressing Qt::Key_Down will trigger a call to stepBy(-1), whereas pressing Qt::Key_Prior will trigger a call to stepBy(10).
    Qt::Key_Prior n'est pas dans la doc, mais il semblerait que ça corresponde à Qt::Key_PageUp.

    Si jamais tu ne tiens pas spécialement à utiliser shift et que les touches de page te conviennent, alors ta spinbox est déjà capable de faire des sauts de 10 incréments.

    Sinon pour ce que tu souhaites faire, il semblerait qu'il faille plutôt changer dans QAbstractSpinBox l'appel à cette fonction et pas la fonction elle même. Pour ça il va falloir regarder du côté des fonctions keyPressEvent et keyReleaseEvent.
    http://qt.developpez.com/doc/4.7/qab...cted-functions
    Il faudra voir le code source de QAbstractSpinBox et le reprendre à ta sauce pour détecter d'autres touches clavier en plus, et appeler stepBy avec le nombre d'incréments voulus.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 65
    Points
    65
    Par défaut
    J'ai surclassé QSpinBox et j'ai surchargé la méthode keyPressEvent. Je regarde si le modificateur shift est activé, si oui j'appelle setValue(singleStep() * 10).
    Si je veux avoir le même comportement avec un QDoubleSpinBox, il faut que je fasse la même chose. J'écris donc deux fois la même code.
    Supposons que maintenant je veux faire la même chose sur un slider ...
    Mais cela veut dire qu'au lieu d'instancier un QSpinBox je dois instancier mon objet avec ma nouvelle classe.

    Y'a t'il un moyen d'appliquer ce comportement à tout les objets de type QAbstractSpinBox de mon application sachant qu'il y en a un certain nombre sans à changer toutes les instanciations ?

    A quoi correspond la touch Key_Prior ?

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Key_prior est à mon avis une erreur qui n'a pas été mise à jour dans la doc. Dans la doc Qt3 on retrouve cette valeur :
    Key_Down = 0x1015, Key_Prior = 0x1016, Key_PageUp = Key_Prior
    Dans la doc Qt4 Key_prior n'existe plus et Key_PageUp est directement affecté par la valeur 0x1016.

    Pour ton implémentation, le réflexe POO serait de centraliser ta fonction surchargée dans une classe héritant de QAbstractSpinBox. Et de faire hériter tous les widgets concernés par cette classe fille et pas QAbstractSpinBox. Sauf qu'on a pas la main sur les classes Qt, on ne peut pas "insérer" une classe à nous dans l'arborescence d'héritage Qt.

    Mais j'ai peut être mal compris, c'est la création des objets qui te pose problème ? On peut indiquer dans QtDesigner d'utiliser une classe à nous dérivant d'un widget plutôt que la classe standard du widget, mais il faut faire ça un par un... Si c'est dans le code, je ne vois qu'un bon vieux chercher/remplacer.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 65
    Points
    65
    Par défaut
    J'envisage en fait d'installer un eventfilter sur l'objet QApplication pour ajouter ce comportement à tout les QAbstractSpinBox de mon application

  6. #6
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Je n'ai jamais manipulé ça mais en effet ça semble faire ce dont tu as besoin. N'hésite pas à poster ta solution !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 65
    Points
    65
    Par défaut
    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
     
    Dans le main :
     
    int main(int argc, char * argv[])
    {
        MyApplication app(argc, argv);
        MyFilterObject myFilterObject;
        app.installEventFilter(&myFilterObject);
    ...
    }
     
     
    Dans MyFilterObject.h
     
    class MyFilterObject : public QObject
    {
    public :
     
        MyFilterObject(QObject* p = 0) : QObject(p){}
     
    protected :
     
        bool eventFilter(QObject *obj, QEvent *e)
        {
            if (e->type() == QEvent::KeyPress){
                QAbstractSpinBox * ab = qobject_cast<QAbstractSpinBox*>(obj);
                if (ab){
                    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
                    if (keyEvent->modifiers() & Qt::ShiftModifier){
                        if (keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down){
                            QSpinBox * box = qobject_cast<QSpinBox*>(ab);
                            if (box){
                                box->setValue(box->value() +  box->singleStep() * (keyEvent->key() == Qt::Key_Up ? 10.0 : -10.0));
                                return true;
                            }
                        }
                    }
                }
            }
            return false;
        }
    };

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

Discussions similaires

  1. Incrément pointage texte n'augmente pas si 2 objets entrent en collision
    Par Padapapadapa dans le forum ActionScript 1 & ActionScript 2
    Réponses: 3
    Dernier message: 11/11/2008, 17h30
  2. Incrémentation d'un champ de la table
    Par viny dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/09/2003, 20h33
  3. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19
  4. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10
  5. Post incrémentation?
    Par Defrag dans le forum C
    Réponses: 4
    Dernier message: 08/10/2002, 10h36

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