【问题标题】:How to change the font and size of image in QTextDocument?如何更改 QTextDocument 中图像的字体和大小?
【发布时间】:2020-10-17 14:00:50
【问题描述】:

我想打印一些qtdesigner设计的文字和图片。

如何更改QTextDocument 中的字体和其他格式?

from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport


class Ui_MainWindow(object):

    def handlePrint(self):
        dialog = QtPrintSupport.QPrintDialog()
        if dialog.exec_() == QtWidgets.QDialog.Accepted:
            self.handlePaintRequest(dialog.printer())

    def handlePreview(self):
        dialog = QtPrintSupport.QPrintPreviewDialog()
        dialog.paintRequested.connect(self.handlePaintRequest)
        dialog.exec_()

    def handlePaintRequest(self, printer):
        document = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(document)
        cursor.insertImage('logo4.jpg')
        cursor.insertBlock()
        cursor.insertText('MY TEXT')
        
        document.print_(printer)


    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_print_previw = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_print_previw.setGeometry(QtCore.QRect(90, 270, 251, 91))
        font = QtGui.QFont()
        font.setPointSize(15)
        self.pushButton_print_previw.setFont(font)
        self.pushButton_print_previw.setObjectName("pushButton_print_previw")
        self.pushButton_print = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_print.setGeometry(QtCore.QRect(440, 270, 251, 91))
        font = QtGui.QFont()
        font.setPointSize(15)
        self.pushButton_print.setFont(font)
        self.pushButton_print.setObjectName("pushButton_print")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        ############################################################
        self.pushButton_print_previw.clicked.connect(self.handlePreview)
        ############################################################

        ############################################################
        self.pushButton_print.clicked.connect(self.handlePrint)
        ############################################################



    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_print_previw.setText(_translate("MainWindow", "Print Preview"))
        self.pushButton_print.setText(_translate("MainWindow", "Print"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt5 qtextdocument


    【解决方案1】:

    document.print_(printer)很方便,但也有点不灵活。

    因为您不使用QTextEdit,所以您只能通过您的代码来编辑格式信息。 (除了事先设置的setHtml。) 如果你喜欢画QPrinter文档,你可以使用QPainter

    正常情况下,虽然paintEvent(self, event)中使用了QPainter,但只要将QPaintDevice的子类设置为QPainter的构造函数,就可以随意绘制了。 但你必须准确计算分配。

    QPrinter 是QPaintDevice 的子类。

    陷阱


    QPainter.drawText 的左上角是文本的底行。

    (x, y)→ 我的文字


    这是代码。

    # -*- coding: utf-8 -*-
    from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport
    
    
    class Ui_MainWindow(object):
    
        def handlePrint(self):
            dialog = QtPrintSupport.QPrintDialog()
            if dialog.exec_() == QtWidgets.QDialog.Accepted:
                self.handlePaintRequest(dialog.printer())
    
        def handlePreview(self):
            dialog = QtPrintSupport.QPrintPreviewDialog()
            dialog.paintRequested.connect(self.handlePaintRequest)
            dialog.exec_()
    
        def handlePaintRequest(self, printer):
            document = QtGui.QTextDocument()
    #        cursor = QtGui.QTextCursor(document)
    #        cursor.insertImage('logo4.jpg')
    #        cursor.insertBlock()
    #        cursor.insertText('MY TEXT')
    #        document.print_(printer)
            documentRootFrameFormat = document.rootFrame().frameFormat()
            documentLeftMargin = documentRootFrameFormat.leftMargin()
            documentTopMargin = documentRootFrameFormat.topMargin()
            drawn_im = QtGui.QImage("logo4.jpg")
            drawn_im_height = drawn_im.height()        
    
            painter = QtGui.QPainter(printer)
            painter.drawImage(documentLeftMargin, documentTopMargin, drawn_im)
            painter_font = painter.font()
            #you can set flag which font is used.
            custom_font = QtGui.QFont("Segoe UI Light", 18)        
            fontMetricsF = QtGui.QFontMetricsF(custom_font)
            painter.save()
            painter.setFont(custom_font)
            height_fontMetricsF = fontMetricsF.height()
            painter.drawText(documentLeftMargin, documentTopMargin + drawn_im_height + height_fontMetricsF, 'MY TEXT')
            painter.restore()
    
    
    
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.pushButton_print_previw = QtWidgets.QPushButton(self.centralwidget)
            self.pushButton_print_previw.setGeometry(QtCore.QRect(90, 270, 251, 91))
            font = QtGui.QFont()
            font.setPointSize(15)
            self.pushButton_print_previw.setFont(font)
            self.pushButton_print_previw.setObjectName("pushButton_print_previw")
            self.pushButton_print = QtWidgets.QPushButton(self.centralwidget)
            self.pushButton_print.setGeometry(QtCore.QRect(440, 270, 251, 91))
            font = QtGui.QFont()
            font.setPointSize(15)
            self.pushButton_print.setFont(font)
            self.pushButton_print.setObjectName("pushButton_print")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
            ############################################################
            self.pushButton_print_previw.clicked.connect(self.handlePreview)
            ############################################################
    
            ############################################################
            self.pushButton_print.clicked.connect(self.handlePrint)
            ############################################################
    
    
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.pushButton_print_previw.setText(_translate("MainWindow", "Print Preview"))
            self.pushButton_print.setText(_translate("MainWindow", "Print"))
    
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

    我的结果

    如果要使用QTextCursor,可以使用QTextCursor的方法设置Font & format。

    您可以通过此代码获得类似的结果。 如果您不希望高度控制,我建议您这样做。

    其他解决方案

    def handlePaintRequest(self, printer):
        document = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(document)
        
        cursor.insertImage("logo4.jpg")
        cursor.insertBlock()
        charFormat = cursor.charFormat()
        charFormat.setFont(QtGui.QFont("Segoe UI Light", 18))
        cursor.insertText('MY TEXT', charFormat)
    
        document.print_(printer)
    

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 2015-10-22
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 2016-08-18
      • 2011-06-14
      相关资源
      最近更新 更多