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 :

Encadrer certaines cellules d'un QTextDocument


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Par défaut Encadrer certaines cellules d'un QTextDocument
    Bonjour à tous,
    J'affiche le contenu d'une requete SQLalechemy dans un QTextDocument formaté avec un QTextTableFormat. Cela me permet d'avoir les données bien alignées. On peut, avec les options, afficher (ou non) un cadre sur toutes les cellules.
    Je cherche à pouvoir encadrer une cellule spécifiquement en fonction d'un paramètre, mais je ne trouve pas la bonne procédure.
    Quelqu'un pourrait-il me mettre sur la voie ?

    Merci d'avance.
    Cordialement,

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 197
    Par défaut
    Bonjour

    je ne connais pas specialement QTextDocument mais en regardant la doc il semble que le cadre s'applique à toutes les cellules DU QTextTableFormat.
    Apparemment rien n'empêche d avoir plusieurs formats (un par cellule) dans le QTextDocument.. à creuser!

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'avais déjà cherché, et je n'ai toujours pas trouvé.

    Mais, par contre, si on veut mettre en évidence certaines cases, il est assez facile de peindre la case en couleur.

    Voilà un petit code qui fait ça, et qui mettre en jaune la case [1,2]:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys, os
     
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    def affichecran(fichier):
        """affiche le fichier avec le viewer par défaut de l'OS"""
        if os.path.exists(fichier):
            # tentative d'affichage pour Windows
            try:
                os.startfile(fichier)
                return 
            except Exception:
                pass 
            # ça n'a pas marché: on essaye Linux
            try:
                os.system('xdg-open ' + fichier)
                return
            except Exception:
                pass
            # aucun des affichages ci-dessus ne marche: on ne fait rien!
     
    #############################################################################
     
    app = QtGui.QApplication(sys.argv)
     
    # créer le document
    doc = QtGui.QTextDocument()
    cur = QtGui.QTextCursor(doc)
     
    # créer le format de la table
    tableFormat = QtGui.QTextTableFormat()
    tableFormat.setAlignment(QtCore.Qt.AlignCenter) # la table sera au mieu horiz.
    tableFormat.setBorder(2.0)
    tableFormat.setCellPadding(10)
    tableFormat.setCellSpacing(3)
     
    # insérer la table 3x3 avec ce format
    imax, jmax = 3, 3
    table = cur.insertTable(imax, jmax, tableFormat)
     
    # écrire un nombre dans toutes les cases
    for i in range(0,3):
        for j in range(0, 3):
            cellCur = table.cellAt(i, j).firstCursorPosition()
            cellCur.select(QtGui.QTextCursor.LineUnderCursor) # sélectionner la ligne
            cellCur.removeSelectedText() # effacer le texte antérieur
            cellCur.insertText(u"%d" % (i*imax+j,))
     
    cell = table.cellAt(1, 2)
    format = cell.format()
    format.setBackground(QtCore.Qt.yellow) # peindre la cellule [1,2] en jaune 
    cell.setFormat(format)
     
    # imprimer dans un pdf
    fichierpdf = "sample.pdf"
    printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
    printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
    printer.setOutputFileName(fichierpdf)
    doc.print_(printer)
     
    # afficher le fichier pdf à l'écran en utilisant le pdfreader par défaut
    affichecran(fichierpdf)

  4. #4
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Par défaut
    Merci à vous pour vos pistes ...

    Je continue de chercher ... Je voudrais essayer d'insérer une table (1 colonne, 1 rangée) avec le format qui va bien (un cadre !) à l'intérieur d'une cellule de la table principale (sans cadre). Mais apparemment cela ne fonctionne pas !
    @+

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà comment on peut insérer une table 1x1 avec un entourage d1 pixel dans une case d'une table 3x3 sans entourage:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys, os
     
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    def affichecran(fichier):
        """affiche le fichier avec le viewer par défaut de l'OS"""
        if os.path.exists(fichier):
            # tentative d'affichage pour Windows
            try:
                os.startfile(fichier)
                return 
            except Exception:
                pass 
            # ça n'a pas marché: on essaye Linux
            try:
                os.system('xdg-open ' + fichier)
                return
            except Exception:
                pass
            # aucun des affichages ci-dessus ne marche: on ne fait rien!
     
    #############################################################################
     
    app = QtGui.QApplication(sys.argv)
     
    # créer le document
    doc = QtGui.QTextDocument()
    cur = QtGui.QTextCursor(doc)
     
    # créer le format de la table
    tableFormat = QtGui.QTextTableFormat()
    tableFormat.setBorder(0)
    tableFormat.setCellPadding(0)
    tableFormat.setCellSpacing(15)
     
    # insérer la table 3x3 avec ce format
    imax, jmax = 3, 3
    table = cur.insertTable(imax, jmax, tableFormat)
     
    # écrire un nombre dans toutes les cases
    for i in range(0,3):
        for j in range(0, 3):
            cellCur = table.cellAt(i, j).firstCursorPosition()
            cellCur.select(QtGui.QTextCursor.LineUnderCursor) # sélectionner la ligne
            cellCur.removeSelectedText() # effacer le texte antérieur
            cellCur.insertText(u"%d" % (i*imax+j,))
     
    #============================================================================
    # créer une 2e table de taille 1,1, de format 'tableFormat2 ' dans la case 1,2
     
    # curseur de la case 1,2
    cellCur = table.cellAt(1, 2).firstCursorPosition()
     
    # effacement du contenu éventuel de la case 1,2 pour insérer la table2
    cellCur.select(QtGui.QTextCursor.LineUnderCursor) # sélectionner la ligne
    cellCur.removeSelectedText() # effacer la ligne sélectionnée
     
    # créer le nouveau format de la table2 à insérer dans la case 1,2
    tableFormat2 = QtGui.QTextTableFormat()
    tableFormat2.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
    tableFormat2.setBorder(1) # avec un entourage d'1 pixel
    tableFormat2.setCellPadding(2) # espacement de l'entourage du nombre
    tableFormat2.setCellSpacing(0) # espacement de l'entourage dans la case
     
    # insérer la table 1x1 dans la case 1,2 avec le format 'tableformat2'
    table2 = cellCur.insertTable(1, 1, tableFormat2)
     
    # et y placer le texte '5'
    cellCur2 = table2.cellAt(0, 0).firstCursorPosition()
    cellCur2.insertText(u"%d" % (5,))
    #============================================================================
     
    # imprimer dans un pdf
    fichierpdf = "sample.pdf"
    printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
    printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
    printer.setOutputFileName(fichierpdf)
    doc.print_(printer)
     
    # afficher le fichier pdf à l'écran en utilisant le pdfreader par défaut
    affichecran(fichierpdf)
    Il faut tout de même chercher à aligner les nombres de la table 3x3 avec le nombre entouré de la table 1x1, sinon, ce n'est pas très beau.

  6. #6
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Par défaut
    Bonjour,

    Merci tyrtamos, tu es un champion !

    Il me reste 3 points encore à élucider pour finir le tour de la question:
    1 - J'ai en fait 2 cadres imbriqués qui s'affichent. Un premier autour de la table et un autre autour de la cellule. J'ai essayé déjà pas mal de choses mais je n'arrive pas à n'avoir qu'un cadre. Si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tformatT.setBorder(1)   # encadre la cellule avec un cadre d'1 pixel
    tformatT.setCellSpacing(0)
    j'obtiens en fait les 2 cadres accolés ce qui fait 2 pixels et ce n'est pas ce que je cherche à avoir.

    2 - L'encadrement de la cellule est limité à la largeur du texte de la cellule et je préférerais avoir un encadrement dont la largeur soit la largeur (donc la plus grande) totale de la colonne de la table principale.

    3 - Je voudrais aussi essayer d'encadrer la totalité de la ligne (donc sans encadrement spécifique par cellule)

    Je vais continuer à chercher et je posterai mes résultats. Je reste néanmoins à l'écoute de toutes les pistes.
    Merci d'avance.

    Voici mon code actuel :
    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
     
        def report(self):
            document = QtGui.QTextDocument()
            cursor = QtGui.QTextCursor(document)
            model = self.appel.vue.model()      # modèle des données à afficher
            # format de la table principale
            format = QtGui.QTextTableFormat()   
            format.setBorderStyle(QtGui.QTextFrameFormat.BorderStyle_None)
            format.setCellPadding(2)
            # format de la table secondaire 
            tformatT = QtGui.QTextTableFormat()
            tformatT.setBorder(1)   # encadre la cellule
            tformatT.setBorderBrush(QtGui.QBrush(QtCore.Qt.black))
            tformatT.setCellPadding(1)
            tformatT.setCellSpacing(1)
            tformatT.setBackground(QtGui.QBrush(QtCore.Qt.yellow))  # colorie en jaune la cellule
            # insertion de la table principale
            table = cursor.insertTable(model.rowCount(), model.columnCount(), format)
            for row in range(table.rows()):
                for column in range(table.columns()):
                    if model.data(model.index(row, 5),QtCore.Qt.DisplayRole) == True:   # test pour l'encadrement
                        cellCur = table.cellAt(row, column).firstCursorPosition()
                        cellCur.select(QtGui.QTextCursor.LineUnderCursor) # sélectionner la ligne   
                        table2 = cellCur.insertTable(1, 1, tformatT) 
                        cellCur2 = table2.cellAt(0, 0).firstCursorPosition()
                        cursorCur = cellCur2    
                    else:
                        cursorCur = cursor
                    item = model.data(model.index(row, column),QtCore.Qt.DisplayRole)
                    print item
                    if item is not None:
                        # insertion du texte dans le bon cursor
                        if type(item) != QtCore.QDate:
                            cursorCur.insertText(unicode(item))
                        else:
                            cursorCur.insertText(item.toString('dd/MM/yyyy'))
                    cursor.movePosition(QtGui.QTextCursor.NextCell)
            # lancement de l'affichage du document avec les options d'impression
            self.frame = report.Report(self.appel, document)
            self.frame.setWindowModality(QtCore.Qt.ApplicationModal)        
            self.frame.show()

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/08/2006, 14h57
  2. [HTML/CSS] a:hover sur certaines cellules
    Par kahya dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 13/06/2006, 16h30
  3. [JTABLE]Colorier certaine cellule
    Par cameleon2002 dans le forum Composants
    Réponses: 3
    Dernier message: 31/12/2005, 10h15
  4. [JTable] Changer le style de certaines cellulles
    Par bourinator dans le forum Composants
    Réponses: 4
    Dernier message: 08/10/2005, 14h40
  5. [JTable] Empêcher sélection de certaines cellules
    Par Oliveuh dans le forum Composants
    Réponses: 6
    Dernier message: 28/07/2004, 12h47

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