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

PyQt Python Discussion :

[QTimeEdit] Le compteur horaire ne s'incrémente pas lorsque la section courante atteint son maximum


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Septembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Septembre 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [QTimeEdit] Le compteur horaire ne s'incrémente pas lorsque la section courante atteint son maximum
    Bonjour,

    Je souhaite utiliser la classe QTimeEdit pour permettre à l'utilisateur de contrôler l'heure courante dans un programme.
    Lorsque l'utilisateur appuie sur les flèches vers le haut, l'heure s'incrémente bien (en fait, c'est la section correspondante qui s'incrémente) mais l'incrémentation s'arrête lorsque on a atteint le nombre maximum de la section:
    Par exemple, si l'heure est 14:02:30s et que le curseur de l'utilisateur est sur les secondes et que celui-ci clique 29 fois, alors les secondes s'incrémentent et l'heure sera 14:02:59 mais si il continue à cliquer, l'heure reste bloquée à 14:02:59 alors que je souhaiterais passer à 14:03:00. Idem dans l'autre sens, la section reste bloquée à 0.
    Quelqu'un sait-t-il comment contourner cela et faire en sorte de passer à l'heure suivante (ou précédente si l'utilisateur clique sur le flèche vers le bas) ?

    P.S.: je précise que je débute avec PyQt...

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    C'est le comportement normal, il faut régler l'heure section par section.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Septembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Septembre 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse: c'est bien ce que je pensais. Y a t-il un moyen de réécrire le code qui est exécuté lorsque l'utilisateur clique sur les flèches (il faut alors savoir sur quelle flèche il a cliqué) ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Salut, je dirais qu'il faudrait modifier la fonction stepEnabled de QTimeEdit pour vérifier les valeurs et si besoin convertir la nouvelle donnée
    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    si secondes > 59 :
    minutes + 1
    secondes - 60
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class QTimeEditCustom(QTimeEdit):
        def __init__(self, Parent=None):
            super().__init__(Parent)
     
        def stepEnabled(self):
    Faut juste regarder ce que renvoie la fonction stepEnabled par défaut.
    https://doc.qt.io/qt-5/qabstractspin...ml#stepEnabled


    en esperant que ça puisse aider.
    Sous Kubuntu 20.04

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Le problème vient du fait que les boutons sont désactivés automatiquement à certaines valeurs, la lineEdit est surveillée par un QValidator, par exemple les valeurs 0 et 59 pour la section minutes.

    Il faut donc tromper le système en retournant toujours un stepEnabled(True | True)

    Mais il faut bien sur, gérer soi-même les valeurs à afficher.

    Ceci fonctionne comme voulu:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    # -*- coding: utf-8 -*-
     
    import sys
     
    from datetime import datetime, timedelta
     
    from PyQt5.QtCore import QTime
    from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout, 
                                 QTimeEdit, QAbstractSpinBox)
     
    class RollingTimeEdit(QTimeEdit):
        def __init__(self, parent=None):
            super().__init__(parent)
     
        def stepBy(self, step):
            section = self.currentSection()
            old = self.get_python_time()
            if section == 0x04:
                delta = timedelta(seconds=step)
     
            elif section == 0x08:
                delta = timedelta(minutes=step)
     
            else:
                delta = timedelta(hours=step)
     
            new = old + delta
            self.setTime(QTime(new.hour, new.minute, new.second))
     
        def get_python_time(self):
            """Convert QTime to datetime instance.
     
            """
            time_ = self.time()
            return datetime(1970, 1, 1,
                            hour=time_.hour(), 
                            minute=time_.minute(), 
                            second=time_.second())
     
        def stepEnabled(self):
            return (QAbstractSpinBox.StepUpEnabled | 
                    QAbstractSpinBox.StepDownEnabled)
     
     
     
     
    if __name__ == '__main__':
        app = QApplication([])
        w = QWidget()
        l = QGridLayout(w)
        r = RollingTimeEdit(w)
        l.addWidget(r, 0, 0, 1, 1)
        w.show()
        t = QTime().currentTime()
        r.setTime(t)
        sys.exit(app.exec_())
    Pour PyQt4 changez les imports
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    from PyQt4.QtCore import QTime
    from PyQt4.QtGui import (QApplication, QWidget, QGridLayout, 
                                 QTimeEdit, QAbstractSpinBox)

Discussions similaires

  1. [XL-2007] incrémenter un compteur type toupie avec un pas de 0.1
    Par guillaume30c dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/12/2011, 11h41
  2. Mon compteur n'incrémente pas
    Par louay02 dans le forum Débuter
    Réponses: 3
    Dernier message: 29/05/2011, 19h36
  3. l'index ne s'incrémente pas automatiquement
    Par une_tite_question dans le forum JDBC
    Réponses: 4
    Dernier message: 22/04/2008, 23h21
  4. Mon NumeroAuto ne s'incrémente pas
    Par omegabahamut dans le forum Access
    Réponses: 11
    Dernier message: 15/02/2008, 12h03
  5. [XSLT][Compteur]qui ne s'incremente pas
    Par fraoustin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/01/2005, 18h11

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