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 :

Imprimer un QTableWidget en PDF


Sujet :

PyQt Python

  1. #1
    Membre averti
    Homme Profil pro
    Gestionnaire d'environnement et coordinateur technique de projet
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire d'environnement et coordinateur technique de projet

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut Imprimer un QTableWidget en PDF
    Bonjour,

    La question est dans le titre, je ne trouve rien qui me permette d'imprimer ou d'exporter un planning généré dans un QTableWidget dans un PDF.
    Exemple d'image :

    Nom : screenshot.PNG
Affichages : 3463
Taille : 76,3 Ko

    J'ai vu que QPrinter existait mais je ne pense pas que ça réponde au besoin.
    J'ai vu que QPixmap pouvait prendre des screenshot, j'ai donc pensé que je pouvais screenshot seulement tel widget et jouer avec les images pour générer un PDF mais ça a pas l'air possible...

    Si vous avez des idées…

    Merci


    EDIT:
    La fonction QWidget.grab() de la doc QT5 peut potentiellement servir, seulement d'après la doc:
    If a rectangle with an invalid size is specified (the default), the entire widget is painted.
    Ce qui est faux vu que seul la partie visible du tableau est exporté.

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Avec Qt l'export en pdf passe par QPrinter. En tous cas c'est apparemment la solution la plus simple.

    Mais la mise en page reste de ton ressort, avec un QTextDocument par exemple où, avec setIndentWidth(), tu pourras aisément gérer tes alignements en colonnes.

  3. #3
    Membre averti
    Homme Profil pro
    Gestionnaire d'environnement et coordinateur technique de projet
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire d'environnement et coordinateur technique de projet

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Salut,

    J'ai trouvé une solution que je poste ici pour ceux que ça intéressera s'ils arrivent à déchiffrer le bazar.

    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
     
        def export_planning(self):
            fname = QtWidgets.QFileDialog.getSaveFileName(self, 'Enregistrer un fichier', '', '*.xlsx')
     
            if fname[0] != '':
                myTableView = self.tableWidget_4
     
                rows = myTableView.rowCount()
                columns = myTableView.columnCount()
                totalWidth = 0
                totalHeight = 0
                for c in range(columns):
                    if c == 0:
                        column_to_fixed = myTableView.columnWidth(c)
                    totalWidth += myTableView.columnWidth(c)
     
                for r in range(rows):
                    totalHeight += myTableView.rowHeight(r)
     
                printer = QtGui.QPixmap(totalWidth, totalHeight)
                painter = QtGui.QPainter(printer)
     
                area = printer.rect()
     
                xscale = area.width() / totalWidth
                yscale = area.height() / totalHeight
                painter.scale(xscale, yscale)
     
                painter.begin(printer)
     
                for r in range(rows):
                    for c in range(columns):
                        if r == 0:
                            if c == 0:
                                idx = myTableView.model().index(r, c)
                            else:
                                if c % 7 == 1:
                                    idx = myTableView.model().index(r, c)
                        else:
                            idx = myTableView.model().index(r, c)
                        option = myTableView.viewOptions()
                        option.rect = myTableView.visualRect(idx)
     
                        if r % 2 == 1 and c == 0:
                            brush = QtGui.QBrush(QtGui.QColor(220, 220, 220), QtCore.Qt.SolidPattern)
                            painter.fillRect(option.rect, brush)
                        else:
                            brush = QtGui.QBrush(QtGui.QColor(255, 255, 255), QtCore.Qt.SolidPattern)
                            painter.fillRect(option.rect, brush)
                        myTableView.itemDelegate().paint(painter, option, idx)
                painter.end()
                printer.save("temp.png", "PNG")
     
                workbook = Workbook(fname[0])
                worksheet = workbook.add_worksheet('Planning')
                worksheet.protect()
                worksheet.freeze_panes(0, int(int(column_to_fixed/8.43)/8.43))
                worksheet.insert_image('A2', './temp.png')
                workbook.close()
                os.remove('./temp.png')
    J'ai trouvé une fonction similaire sur le net que j'ai adapté à mes besoins, le rendu est tout à fait correct. dans un fichier excel avec la première colonne figé.

    Bye

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Imprimer et enregistrer un pdf en PJ
    Par REFLEX42 dans le forum VBA Outlook
    Réponses: 4
    Dernier message: 10/05/2012, 16h20
  2. [AC-2000] Imprimer un Etat en PDF page par page
    Par tijan dans le forum IHM
    Réponses: 1
    Dernier message: 25/11/2010, 19h35
  3. Réponses: 0
    Dernier message: 16/10/2009, 13h03
  4. Imprimer etat dans plusieurs PDF automatiquement
    Par marsu33000 dans le forum WinDev
    Réponses: 2
    Dernier message: 12/03/2009, 13h34
  5. Imprimer une form en pdf
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/10/2007, 15h16

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