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 :

aperçu avant impression


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Billets dans le blog
    1
    Par défaut aperçu avant impression
    Bonjour,
    Je veux faire de l'aperçu avant impression du texte, disons d'un tableau contenant des données. Le tableau sera tracé et les données du tableau sont dans une liste de liste. Et avec un bouton permettant d'imprimer l'aperçu. Merci. Je sais faire de l'impression avec QPrinter donc si la solution pouvait être avec ça, ça serait mieux.

  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,

    Il y a une classe qui fait ça très bien: QPrintPreviewDialog du module QtPrintSupport (version PyQt5).

    Mais, bien sûr, il faut avoir fait la mise en page avant!

    Une des solutions est de transformer la liste de listes en chaine html dans un QTextEdit.

    Mais attention: le QTextEdit ne supporte qu'un sous-ensemble de html appelé "rich text": il faut souvent se reporter à la doc de Qt pour savoir ce qui marche:
    http://doc.qt.io/qt-5/richtext-html-subset.html

    Voilà un petit code de test qui fait tout ça:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import sys
    from PyQt5 import (QtWidgets, QtCore, QtPrintSupport)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.tedit = QtWidgets.QTextEdit(self)
     
            # liste de liste à imprimer dans une table
            L = [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]]
     
            # préparation de la construction de la table html
            tabledeb = '<table border="1" align="left" width="100%" cellspacing="0" cellpadding="4">'
            tablefin = '</table>'
     
            tablelignedeb = '<tr>'
            tablelignefin = '</tr>'
     
            tablecoldeb = '<td>'
            tablecolfin = '</td>'
     
            # construction de la table html
            html = tabledeb
            for ligne in L:
                html += tablelignedeb
                for elem in ligne:
                    html += tablecoldeb + elem + tablecolfin
                html += tablelignefin  
            html += tablefin  
     
            # enregistrer la table html dans le QTextEdit
            self.tedit.setHtml(html)
     
            # création du bouton pour lancer l'impression
            self.bouton = QtWidgets.QPushButton("imprimer", self)
            self.bouton.clicked.connect(self.imprimer)
     
            # placement des widgets dans la fenêtre
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.tedit, 0, 0)
            posit.addWidget(self.bouton, 1, 0)
            self.setLayout(posit)
     
        @QtCore.pyqtSlot(bool)
        def imprimer(self):
            printer = QtPrintSupport.QPrinter()
            preview = QtPrintSupport.QPrintPreviewDialog(printer)
            preview.paintRequested.connect(self.tedit_printPreview)
            preview.exec_()
     
        @QtCore.pyqtSlot("QPrinter")
        def tedit_printPreview(self, printer):
            self.tedit.print_(printer)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Une autre solution plus "lourde" que d'utiliser QPrintPreviewDialog est de créer un fichier pdf avec QPrinter, de le visualiser avec adobe reader (ou équivalent) et de l'imprimer avec ce même visualiseur.

    Une autre solution est de transformer la liste de listes en fichier csv et de le donner en importation à un tableur type Excel.

  3. #3
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Billets dans le blog
    1
    Par défaut
    Bonjour tyrtamos, j'ai beaucoup aimé la solution que tu m'as proposé
    Citation Envoyé par tyrtamos Voir le message

    Une des solutions est de transformer la liste de listes en chaine html dans un QTextEdit.
    et je pense qu'elle peut satisfaire mes attentes. Juste une ou deux choses :
    1. Comment faire pour inserér du texte et de l'image dans l'entête et le pied de page
    2. Ajouter un titre au tableau


    Merci pour le temps que vous m'accordez

  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
    S'il s'agit de construire une page complète, c'est facile: on dispose des ressources du html (ou plutôt du sous-ensemble "rich text"). Il est donc possible d'insérer des images ainsi que de faire le choix et l'embellissement des polices de caractères (taille, gras, italique, couleur, ...). Etc...

    A titre d'exemple, il suffit de consulter la démo "textedit.py" qui se trouve ici sous Windows: C:\Python34\Lib\site-packages\PyQt5\examples\richtext\textedit. Et le texte html affiché est dans le fichier "example.html". A noter que si le texte proposé dépasse une page A4, le programme ne gère pas les entêtes et bas de pages.

    A noter aussi qu'un saut de page à un endroit précis du code html peut être ajouté avec: <div style="page-break-before:always;"></div>


    Si par contre il s'agit de gérer un texte html long en multi-pages automatique avec en-têtes et bas de pages, comme le fait MSWord, c'est possible mais c'est BEAUCOUP plus compliqué...

  5. #5
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Billets dans le blog
    1
    Par défaut
    Merci pour cette réponse, selon les propos suivants
    A noter que si le texte proposé dépasse une page A4, le programme ne gère pas les entêtes et bas de pages.
    dois-je comprendre qu'il y a la possibilité lorsque mon impression ne dépasse pas une page A4, je peux obtenir la zone d'entête et pied de page pour y effectuer mes opérations? Si ce n'est pas possible, je vais me repencher sur la solution avec QPrintPreviewDialog pour tout "dessiner à la main" aux positions que je veux. Comme je l'ai dit dans l'introduction, j'ai déjà fait une chose pareille en "dessinant" avec QPrinter et QPainter mais j'envoyais le résultat directement à l'imprimante. Maintenant que je veux essayer l'aperçu, j'arrive plus à afficher. Est-ce cela peut être le fait d'utiliser QPrintPreviewWidget au lieu de QPrintPreviewDialog? Je vais essayer les deux et voir la différence et je vous reviens. En attendant, si vous avez une astuce sous la main, je suis preneur!!!!!

    Pour vous donner idée de mon blocage; voici dans votre code ce que je veux faire et que j'arrive pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.tedit.print_(printer)
    Etant donné que moi, je dessine directement sur un QPainter, alors je ne sais pas comment afficher ce QPainter sur le QPrintPreviewDialog ou widget et ensuite l'envoyer pour impression comme vous l'avez fait. Merci mais je ne sais pas si j'ai bien exprimé le problème.

  6. #6
    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 le cadre d'un de mes programmes, je crée des courriers multi-pages avec en-têtes et bas de page mais en pdf. Je n'utilise donc pas QPrintPreviewDialog et je n'en ai pas besoin: c'est l'affichage du pdf par adobe reader qui me sert de preview et de fonction d'impression. Un avantage supplémentaire de cette solution, c'est que je dispose ainsi du fichier pdf, et que je peux l'envoyer par email et le sauvegarder quelque part sur un disque. Je fais d'ailleurs un truc en plus: j'encapsule tous les fichiers pdf d'une même période (env. 500) dans un seul (gros) fichier pdf avec le module Python "PyPDF2" (voir pypi).

    Et comme toi, en imprimant avec QPainter pour gérer mes pages, je ne sais pas utiliser QPrintPreviewDialog en même temps.

    Je n'ai jamais utilisé QPrintPreviewWidget: peut-être y a-t-il une solution avec?

    Désolé de ne pouvoir pas t'aider plus, mais si quelqu'un trouve une solution, ça m'intéresse aussi!

Discussions similaires

  1. Concepteur RAVE sous DELPHI 7 : aperçu avant impression
    Par tarbala dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/06/2020, 00h37
  2. Aperçu avant impression d'un TRichEdit
    Par PoOky dans le forum Composants VCL
    Réponses: 2
    Dernier message: 31/01/2016, 23h19
  3. Réponses: 6
    Dernier message: 04/10/2005, 20h18
  4. Aperçu avant impression
    Par Zebulon777 dans le forum Access
    Réponses: 18
    Dernier message: 15/09/2005, 10h46
  5. [Débutante] Aperçu avant impression d'un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 09/07/2004, 09h52

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