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 :

Ligne simple autour QTextTableFormat


Sujet :

PyQt Python

  1. #1
    Membre confirmé
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Par défaut Ligne simple autour QTextTableFormat
    Bonsoir,
    je cherche depuis un bon moment comment, lorsque j'imprime, avoir un cadre avec une ligne simple, car je dois reproduire un formulaire.
    Est il possible d'avoir un cadre ou pas dans une cellule d'un QTextTableFormat ?
    merci à vous de votre attention
    Voici un bout de code qui représente mon problème :

    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
    #! /usr/bin/env python
    #-*-coding: utf-8 -*-
    # Python 3.2
     
    import os,sys
    from PySide import QtCore,QtGui
    app = QtGui.QApplication(sys.argv)
     
     
    alignCentrer= QtGui.QTextBlockFormat()
    alignCentrer.setAlignment(QtCore.Qt.AlignCenter)
     
     
    editor = QtGui.QTextEdit()
    cursor = editor.textCursor()
    cursor.movePosition(QtGui.QTextCursor.Start)
     
    TableFormat = QtGui.QTextTableFormat()
    #centre la table sur la feuille
    TableFormat.setAlignment(QtCore.Qt.AlignHCenter)
    TableFormat.setCellPadding(2)#marge a l'interieur des cellules
    #creer ligne et colone
    entete = cursor.insertTable(1,1,TableFormat)
    FrameFormat = cursor.currentFrame().frameFormat()
    FrameFormat.setMargin(0)#marge autour du cadre
    FrameFormat.setPadding(0)#marge entre les traits du cadre
    FrameFormat.setBorderStyle(QtGui.QTextFrameFormat.BorderStyle_Solid)
    FrameFormat.setBorderBrush(QtGui.QColor(0,0,0))
    FrameFormat.setBorder(1)#determine la bordure
    cursor.currentFrame().setFrameFormat(FrameFormat)
     
    cursor = entete.cellAt(0, 0).firstCursorPosition()
    cursor = entete.cellAt(0, 0).lastCursorPosition()
    cursor.insertText("Titre")
     
    dialog = QtGui.QPrintPreviewDialog()
    dialog.paintRequested.connect(editor.print_)
    dialog.exec_()

  2. #2
    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à un petit code qui a l'air de faire ce que tu veux: un titre avec un simple entourage. C'est du PyQt4, mais en changeant l'importation par PySide, ça devrait marcher:

    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
    #Python 3.2
     
    import sys, os
     
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
     
    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 milieu.
    tableFormat.setBorder(2.0)
    tableFormat.setCellPadding(2)
    tableFormat.setCellSpacing(0)
     
    # insérer la table 1x1 avec ce format
    imax, jmax = 1, 1
    table = cur.insertTable(imax, jmax, tableFormat)
     
    # écrire un texte dans la case
    cellCur = table.cellAt(0, 0).firstCursorPosition()
    cellCur.select(QtGui.QTextCursor.LineUnderCursor) # sélectionner la ligne
    cellCur.removeSelectedText() # effacer le texte antérieur
    cellCur.insertText("Titre")
     
    # 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
    url = QtCore.QUrl.fromLocalFile(os.path.abspath(fichierpdf)) 
    QtGui.QDesktopServices.openUrl(url)

  3. #3
    Membre confirmé
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Par défaut
    Merci Tyrtamos ton code marche, mais voilà mon formulaire est composé de 4 pages est il possible dans le QtGui.QTextDocument d'insérer des sauts de page.
    J'ai 4 tableaux a imprimer sur 4 pages différentes et je veux faire qu'une impression ?
    soit je crée un nouveau QtGui.QTextTableFormat a chaque fois ou je sépare les cellules comme dans le code que j'ai rajouté
    la je bloque !!!

    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
     
    #Python 3.2
    # -*- coding: utf-8 -*-
    import sys, os
     
    from PySide import QtCore, QtGui
     
    #############################################################################
     
    app = QtGui.QApplication(sys.argv)
     
    # creer le document
    doc = QtGui.QTextDocument()
    cur = QtGui.QTextCursor(doc)
     
    # creer le format de la table
    tableFormat = QtGui.QTextTableFormat()
    tableFormat.setAlignment(QtCore.Qt.AlignCenter) # la table sera au milieu.
    tableFormat.setBorder(2.0)
    tableFormat.setCellPadding(2)
    tableFormat.setCellSpacing(0)
    tableFormat.setBorderStyle(QtGui.QTextFrameFormat.BorderStyle_Solid)
    tableFormat.setBorderBrush(QtGui.QColor(0,0,0))
     
    # inserer la table 1x1 avec ce format
    imax, jmax = 2, 1
    table = cur.insertTable(imax, jmax, tableFormat)
     
    ### a imprimer sur la premiere page
    # ecrire un texte dans la case
    cellCur = table.cellAt(0, 0).firstCursorPosition()
    cellCur.select(QtGui.QTextCursor.LineUnderCursor) # selectionner la ligne
    cellCur.removeSelectedText() # effacer le texte anterieur
    cellCur.insertText("Element de la première page")
     
     
    ### a imprimer sur la deuxieme page
    cellCur = table.cellAt(1, 0).firstCursorPosition()
    cellCur.select(QtGui.QTextCursor.LineUnderCursor) # selectionner la ligne
    cellCur.removeSelectedText() # effacer le texte anterieur
    cellCur.insertText("Element de la deuxième page")
     
     
    # 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 a* l'ecran en utilisant le pdfreader par defaut
    url = QtCore.QUrl.fromLocalFile(os.path.abspath(fichierpdf))
    QtGui.QDesktopServices.openUrl(url)

  4. #4
    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
    Dans la mesure où, avec l'insertion de tableau, on fait du "rich text" (=sous ensemble de html), on peut faire un saut de page avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div style="page-break-before:always;"></div>
    Mais je ne sais pas si le tableau lui-même acceptera d'être coupé. Et puis, s'il l'accepte, on perdra le nom des colonnes (s'il y en a!) sur les pages suivantes.

    Bref, il faut essayer!

  5. #5
    Membre confirmé
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Dans la mesure où, avec l'insertion de tableau, on fait du "rich text" (=sous ensemble de html), on peut faire un saut de page avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div style="page-break-before:always;"></div>
    La je suis paumé

    Ce que je pensais : faire un tableau avec QtGui.QTextTableFormat() 1 différent par page et imprimer les 4 pages en même temps
    en tout cas merci pour ton aide

  6. #6
    Membre confirmé
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Par défaut
    Bonjour,
    ma solution au problème d’insérer un saut de page je le règle ainsi :
    (c'est du bricolage mais je n'a pas trouvé autre chose)
    Etant donné que mon format de texte est toujours le même, j'insère des blocks pour compléter la page !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while doc.blockCount ()<68:
        cur.insertBlock()
    Autre chose je ne trouve pas comment écrire du texte avec une rotation de 45°, est ce possible ?
    Nom : tableau.jpg
Affichages : 362
Taille : 7,1 Ko
    Ainsi que de colorer que l'entête ?
    Soit j'ai le tableau complètement coloré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableFormat.setBackground(QtGui.QColor(200,200,200))
    Soit je n'ai que le texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    alignCentrerGris= QtGui.QTextBlockFormat()
    alignCentrerGris.setAlignment(QtCore.Qt.AlignCenter)
    alignCentrerGris.setBackground(QtGui.QColor(200,200,200))
     
    cursor = entete.cellAt(0, 0).firstCursorPosition().setBlockFormat(alignCentrerGris)
    Merci de votre aide.

  7. #7
    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,

    Pour le changement de page forcé

    Désolé, mais la solution que j'ai proposée plus haut ne marche pas. J'étais pourtant certain de l'avoir déjà utilisé avec succès. C'est peut-être dû à l'impression en pdf.

    Et bravo pour ta solution: elle est astucieuse.

    Mais voilà la solution que je te propose et qui me plait mieux:

    On insère dans le code qui fabrique la page:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # forcer un changement de page dans le texte
    pagebreak = QtGui.QTextBlockFormat()
    pagebreak.setPageBreakPolicy(QtGui.QTextFormat.PageBreak_AlwaysBefore)
    cursor.insertBlock(pagebreak) # cursor est le QTextCursor qui pointe sur le QTextDocument à l'endroit de l'insertion
    Pour l'écriture penchée:

    Je ne sais pas faire.

    Pour mettre certaines cases en couleur

    Principe: on applique un QTextCharFormat avec un setBackground qui va bien à la cellule voulue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    formatCell = QtGui.QTextCharFormat()
    brush = QtGui.QBrush(QtGui.QColor("yellow"))
    formatCell.setBackground(brush)
    case = table.cellAt(0, 0) # on va mettre la case 0,0 en jaune
    case.setFormat(formatCell)
    Voilà un petit code de test qui met les titres de lignes et de colonnes en couleur (Python 3.2 PyQt4):

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    #Python 3.2
     
    import sys, os
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
     
    app = QtGui.QApplication(sys.argv)
     
    # créer le document
    doc = QtGui.QTextDocument()
    cursor = QtGui.QTextCursor(doc)
     
    #----------------------------------------------------------------------------
    # créer le format de la table
    tableFormat = QtGui.QTextTableFormat()
    tableFormat.setAlignment(QtCore.Qt.AlignCenter) # la table sera au milieu.
    tableFormat.setBorder(2.0)
    tableFormat.setCellPadding(2)
    tableFormat.setCellSpacing(0)
     
    # insérer la table 1x1 avec ce format
    imax, jmax = 3, 4
    table = cursor.insertTable(imax, jmax, tableFormat)
     
    # écrire un texte dans chaque case
    for i in range(0, imax):
        for j in range(0, jmax):
            cellCur = table.cellAt(i, j).firstCursorPosition()
            cellCur.select(QtGui.QTextCursor.LineUnderCursor) # sélectionner la ligne
            cellCur.removeSelectedText() # effacer le texte antérieur
            cellCur.insertText(str(i*j))
     
    # mettre les cases de titre de lignes en couleur (ici en jaune)       
    for i in range(0, imax):
        formatCell = QtGui.QTextCharFormat()
        brush = QtGui.QBrush(QtGui.QColor("yellow"))
        formatCell.setBackground(brush)
        case = table.cellAt(i, 0) # on va mettre la case 0,0 en jaune
        case.setFormat(formatCell)
     
    # mettre les cases de titre de colonnes en couleur (ici en jaune)        
    for j in range(0, jmax):
        formatCell = QtGui.QTextCharFormat()
        brush = QtGui.QBrush(QtGui.QColor("yellow"))
        formatCell.setBackground(brush)
        case = table.cellAt(0, j) # on va mettre la case 0,0 en jaune
        case.setFormat(formatCell)
     
    #----------------------------------------------------------------------------
    # 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
    url = QtCore.QUrl.fromLocalFile(os.path.abspath(fichierpdf)) 
    QtGui.QDesktopServices.openUrl(url)

  8. #8
    Membre confirmé
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Par défaut
    Un grand merci Tyrtamos, c'est exactement ce qu'il me fallait.
    j'ai lu et relu la doc Pyside mais avant de comprendre et l'appliquer il y a un sacré bout de chemin.

    Pour l'écriture à 45°, je m'en passerai, si un jour quelqu'un à la solution !

  9. #9
    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,

    Citation Envoyé par rob-42 Voir le message
    Pour l'écriture à 45°, je m'en passerai, si un jour quelqu'un à la solution !
    Il faudrait pouvoir utiliser un QPainter qui, lui, permet d'écrire en penché. Avec ce QPainter, On pourrait essayer d'écrire sur une image QPixmap (considéré comme un QPaintDevice), et d'insérer l'image dans la case en question. J'ai commencé mais je ne suis pas allé au bout.

    PS: si le problème est résolu pour toi: mets [résolu] sur le titre de ton 1er message.

  10. #10
    Membre confirmé
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Par défaut
    Résolu partiellement, j'attends d'avoir un peu de temps pour explorer les pistes que tu m'as donné.

  11. #11
    Membre confirmé
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Par défaut
    Bonsoir,
    Voici tout ce que j'ai pu faire :
    j'ai ce que veux mais la définition d'impression n'est pas top, et ça oblige d'avoir des fichiers en plus dans l'appli !

    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
     
    #! /usr/bin/env python
    #-*-coding: utf-8 -*-
    # Python 3.2
     
    import os,sys
    from PySide import QtCore,QtGui
    app = QtGui.QApplication(sys.argv)
     
    editor = QtGui.QTextEdit()
    cursor = editor.textCursor()
    cursor.movePosition(QtGui.QTextCursor.Start)
     
    alignVertical=QtGui.QTextBlockFormat()
    alignVertical.setAlignment(QtCore.Qt.Vertical)
     
    # créer le format de la table
    tableFormat = QtGui.QTextTableFormat()
    tableFormat.setAlignment(QtCore.Qt.AlignCenter) # la table sera au milieu.
    tableFormat.setBorder(0.5)
    tableFormat.setCellPadding(2)
    tableFormat.setCellSpacing(0)
    tableFormat.setBorderStyle(QtGui.QTextFrameFormat.BorderStyle_Solid)
    tableFormat.setBorderBrush(QtGui.QColor(0,0,0))
     
    rep_cour = os.getcwd()
    fichier=os.path.join(rep_cour,"texte.jpg")
    if os.path.isfile(fichier):
        imageFormat = QtGui.QTextImageFormat()
        imageFormat.setName(fichier)
     
    table = cursor.insertTable(1, 1, tableFormat)
    cellCur = table.cellAt(0, 0).firstCursorPosition().setBlockFormat(alignVertical)
    cellCur = table.cellAt(0, 0).lastCursorPosition()
    cursor.insertImage(imageFormat)
     
    dialog = QtGui.QPrintPreviewDialog()
    dialog.paintRequested.connect(editor.print_)
    dialog.exec_()
    Nom : texte.jpg
Affichages : 340
Taille : 2,2 Ko

    je n'ai pas trouvé comment utiliser un QPainter je pense que le rendu serait parfait car le texte serait directement inséré
    j'ai mis le texte : PySide.QtGui.QPainter. drawText ( Qt.AlignVCenter , "1 heure" )
    - je n'arrive pas à le mettre à 45°
    - je n'arrive pas à le mettre dans le cursor ( cursor.insertImage )

    je pense que je n'arrive pas encore à bien comprendre comment fonctionne globalement pyside, et comment comprendre la doc.
    je vais de lien en lien et après je ne sais plus comment ou pourquoi j'en suis arrivé là

Discussions similaires

  1. [JpGraph] SetAntiAliasing ne fonctionne pas sur les graph lignes simples
    Par JP GRAF dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 22/07/2014, 15h07
  2. [Lotus 7]Saut de ligne simple dans mail Html
    Par Tristan Zwingelstein dans le forum Lotus Notes
    Réponses: 0
    Dernier message: 14/05/2012, 17h29
  3. [certainement simple..]retour à la ligne dans JLabel ?
    Par Baptiste Wicht dans le forum Composants
    Réponses: 7
    Dernier message: 09/08/2011, 17h24
  4. Votre SGBD accepte-t-il les guillemets simples autour des valeurs numériques?
    Par dimalta5 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/03/2009, 14h45
  5. Petit jeu multijoueur en ligne (commençons simple lol)
    Par Archaoniro dans le forum Langage
    Réponses: 25
    Dernier message: 24/03/2006, 18h31

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