2017-01-26 5 views
1

Я разрабатываю приложение с помощью Pyt4. И я хотел бы иметь возможность распечатать главный виджет в pdf-документе. У меня есть собственный qlayout для главного виджета, и я хочу создать PDF-документ с этим qlayout. Я много читал о pyqt qprinter, но я не уверен, что это то, что я хочу.Python PyQt4 создание pdf от qlayout

Может ли кто-нибудь предложить, как я мог бы создать pdf-файл с qlayout, полным qwidgets?

ответ

1

Использование QPixmap.grabWidget для отображения виджета к пиксельной, затем краску, что на QPrinter, который может затем преобразовать его в PDF:

import sys 
from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.text = QtGui.QTextEdit(self) 
     self.text.setText(open(__file__).read()) 
     self.edit = QtGui.QLineEdit(self) 
     self.edit.setText('/tmp/test.pdf') 
     self.buttonSave = QtGui.QPushButton('Save', self) 
     self.buttonSave.clicked.connect(self.handleSave) 
     layout = QtGui.QGridLayout(self) 
     layout.addWidget(self.text, 0, 0, 1, 2) 
     layout.addWidget(self.edit, 1, 0, 1, 1) 
     layout.addWidget(self.buttonSave, 1, 1, 1, 1) 

    def handleSave(self): 
     printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution) 
     printer.setPageSize(QtGui.QPrinter.A6) 
     printer.setColorMode(QtGui.QPrinter.Color) 
     printer.setOutputFormat(QtGui.QPrinter.PdfFormat) 
     printer.setOutputFileName(self.edit.text()) 
     pixmap = QtGui.QPixmap.grabWidget(self).scaled(
      printer.pageRect(QtGui.QPrinter.DevicePixel).size().toSize(), 
      QtCore.Qt.KeepAspectRatio) 
     painter = QtGui.QPainter(printer) 
     painter.drawPixmap(0, 0, pixmap) 
     painter.end() 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(600, 100, 640, 640) 
    window.show() 
    sys.exit(app.exec_()) 

EDIT:

Если QPainter часть выиграл» t по какой-либо причине в вашей настройке вы можете попробовать альтернативный метод сохранения ниже:

def handleSave(self): 
     printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution) 
     printer.setPageSize(QtGui.QPrinter.A9) 
     printer.setColorMode(QtGui.QPrinter.Color) 
     printer.setOutputFormat(QtGui.QPrinter.PdfFormat) 
     printer.setOutputFileName(self.edit.text()) 
     self.render(printer) 

Или другой альтернативы можно было бы использовать QTextDocument:

def handleSave(self): 
     printer = QtGui.QPrinter() 
     printer.setPageSize(QtGui.QPrinter.A5) 
     printer.setResolution(200) 
     printer.setColorMode(QtGui.QPrinter.Color) 
     printer.setOutputFormat(QtGui.QPrinter.PdfFormat) 
     printer.setOutputFileName(self.edit.text()) 
     size = printer.pageRect(QtGui.QPrinter.DevicePixel).size() 
     pixmap = QtGui.QPixmap.grabWidget(self).scaled(
      size.toSize(), QtCore.Qt.KeepAspectRatio, 
      QtCore.Qt.SmoothTransformation) 
     data = QtCore.QByteArray() 
     buffer = QtCore.QBuffer(data) 
     pixmap.save(buffer, 'PNG') 
     document = QtGui.QTextDocument() 
     document.setPageSize(size) 
     document.setHtml('<img src="data:image/png;base64,%s"/>' % 
         bytes(data.toBase64()).decode('ascii')) 
     document.print_(printer) 
+0

Когда я бегу вы код это дает мне две ошибки: 'QPainter :: Конец: Painter не активные, aborted' и' QPainter :: начать() : Возвращено false' вы знаете, как это исправить? –

+0

И когда я пишу qlayout в pdf? –

+0

@CheynShmuel. Код отлично работает для меня. Вы каким-то образом отредактировали его? Нет смысла печатать макет, потому что он не виден. Вы должны распечатать виджет, в котором установлен макет. – ekhumoro

Смежные вопросы