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 :

QCheckBox et délégué dans un QTableWidget


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 38
    Points : 16
    Points
    16
    Par défaut QCheckBox et délégué dans un QTableWidget
    Bonjour

    dans un QtableWidget, ma colonne 0 est une colonne de case à coché.

    Je gère ces case à cochées grace à un delegate (cf ci-dessous)

    Jusqu'a présent cela se passé bien. Mais depuis l'arrivé de Yosemite sur mac, l'interface graphique du système a changé, et la case à coché reste sur fond blanc et le tag aussi. Bref c'est illisible. (cf image)

    Bref je cherche à changer le style de la case à cochée pour la rendre lisible. Mais je n'y arrive pas. Je ne comprend rien ni au painter ni au style etc...

    Pouvez vous m'aider ou me mettre sur la voix?

    Nom : Capture d’écran 2014-10-30 à 16.36.43.png
Affichages : 388
Taille : 5,1 Ko
    premiere case coché, pas la deuxième...

    code du delegate :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    class CBDelegate(QtGui.QStyledItemDelegate):
        """
        A delegate that places a fully functioning QCheckBox in every
        cell of the column to which it's applied
        """
        def __init__(self, parent):
            QtGui.QItemDelegate.__init__(self, parent)
            self.parent = parent
     
        def createEditor(self, parent, option, index):
            '''
            Important, otherwise an editor is created if the user clicks in this
            cell.
            ** Need to hook up a signal to the model
            '''
            return None
     
        def paint(self, painter, option, index):
            '''
            Paint a checkbox without the label.
            '''
            #painter.setPen(QtCore.Qt.darkGreen)
            print painter.isActive()
            checked = index.data().toBool()
            check_box_style_option = QtGui.QStyleOptionButton()
     
            if (index.flags() & QtCore.Qt.ItemIsEditable) > 0:
                check_box_style_option.state |= QtGui.QStyle.State_Enabled
                print 1
            else:
                check_box_style_option.state |= QtGui.QStyle.State_ReadOnly
                print 2
            if checked:
                check_box_style_option.state |= QtGui.QStyle.State_On
                print 3
            else:
                check_box_style_option.state |= QtGui.QStyle.State_Off
                print 4
     
            check_box_style_option.rect = self.getCheckBoxRect(option)
     
            check_box_style_option.state |= QtGui.QStyle.State_Enabled
     
            QtGui.QApplication.style().drawControl(
                QtGui.QStyle.CE_CheckBox, check_box_style_option, painter)
     
        def editorEvent(self, event, model, option, index):
            '''
            Change the data in the model and the state of the checkbox
            if the user presses the left mousebutton or presses
            Key_Space or Key_Select and this cell is editable. Otherwise do nothing
            '''
            # If event type is : Mouse move => Pass
            if event.type() == 5:
                return False
            if not (index.flags() & QtCore.Qt.ItemIsEditable) > 0:
                return False
     
            # Do not change the checkbox-state
            if event.type() == QtCore.QEvent.MouseButtonPress:
                return False
            if event.type() == QtCore.QEvent.MouseButtonRelease or \
               event.type() == QtCore.QEvent.MouseButtonDblClick:
                if event.button() != QtCore.Qt.LeftButton or not \
                   self.getCheckBoxRect(option).contains(event.pos()):
                    return False
                if event.type() == QtCore.QEvent.MouseButtonDblClick:
                    return True
            elif event.type() == QtCore.QEvent.KeyPress:
                if event.key() != QtCore.Qt.Key_Space and\
                   event.key() != QtCore.Qt.Key_Select:
                    return False
                else:
                    return False
     
            # Change the checkbox-state
            self.setModelData(None, model, index)
            return True
     
        def setModelData(self, editor, model, index):
            '''
            The user wanted to change the old state in the opposite.
            '''
     
            # Update model therefore the view delegate
            newValue = not index.data().toBool()
            model.setData(index, format(newValue), QtCore.Qt.EditRole)
            model.submit()
     
            # Save data in SQL Table
            QTableRow = index.row()
            QTableCol = index.column()
            self.parent.editDataItem(
                QTableRow, QTableCol, newValue, refreshTable=False)
     
        def getCheckBoxRect(self, option):
            check_box_style_option = QtGui.QStyleOptionButton()
            check_box_rect = QtGui.QApplication.style().subElementRect(
                QtGui.QStyle.SE_CheckBoxIndicator, check_box_style_option, None)
            check_box_point = QtCore.QPoint(
                option.rect.x() +
                option.rect.width() / 2 -
                check_box_rect.width() / 2,
                option.rect.y() +
                option.rect.height() / 2 -
                check_box_rect.height() / 2)
            return QtCore.QRect(check_box_point, check_box_rect.size())

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    PyQt4 n'est pas supporté pour OS X 10.10.
    Je recommande l'utilisation de PyQt5.
    La beta de Qt 5.4 vient de sortir le 17 octobre et règle certains problèmes de style sous Yosemite:
    http://blog.qt.digia.com/blog/2014/1...eta-available/

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    OK merci.

    J'ai essayé de passer à python3, Qt5 et PyQt5.
    J'ai tout installé avec brew, mais j'ai un souci avec PyQt5 qui ne semble pas être détecté...

    Terminal :
    python3
    >>> import PyQt5
    ImportError: No module named 'PyQt5'
    python3, Qt5 et PyQt5 sont installé (je l'ai vois quand j'utilise la commande 'brew list')

    Du coup je suis coincé... Des idées?

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Et avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from PyQt5 import QtCore, QtGui, QtWidgets
    ?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/07/2015, 13h11
  2. Réponses: 1
    Dernier message: 13/03/2012, 12h41
  3. Verrouiller des cellules dans un QTableWidget
    Par katanaenmousse dans le forum Débuter
    Réponses: 4
    Dernier message: 26/08/2010, 22h43
  4. Faire un bouton dans une QTableWidget
    Par LittleWhite dans le forum Qt
    Réponses: 4
    Dernier message: 06/08/2010, 08h51

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