Précédent   Forum des professionnels en informatique > C et C++ > Bibliothèques > Qt
Qt Forum d'entraide technique sur la bibliothèque Qt. Avant de poster -> F.A.Q Qt
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2012, 22h01   #1
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 49
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 49
Points : 36
Points : 36
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)
nosleduc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 10h07   #2
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
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 :
Citation:
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.
ymoreau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 23h01   #3
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 49
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 49
Points : 36
Points : 36
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 ?
nosleduc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 10h14   #4
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
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 :
Citation:
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.
ymoreau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 14h38   #5
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 49
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 49
Points : 36
Points : 36
J'envisage en fait d'installer un eventfilter sur l'objet QApplication pour ajouter ce comportement à tout les QAbstractSpinBox de mon application
nosleduc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/01/2012, 18h25   #6
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
Je n'ai jamais manipulé ça mais en effet ça semble faire ce dont tu as besoin. N'hésite pas à poster ta solution !
ymoreau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 21h44   #7
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 49
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 49
Points : 36
Points : 36
Code :
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;
    }
};
nosleduc est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h44.


 
 
 
 
Partenaires

Hébergement Web