0

我有一个带有 Css 标签的 HTML 文件,见下文。如您所知,QTextDocument 并不完全接受 Css 标签。我用 QWebEngine 替换它,但没有出现。

在这种情况下我应该使用 QWebEnginePage 还是 QWebEngineView ?

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport
from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineView


class Ui_MainWindow(object):
    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))
        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"))


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

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

    def handlePaintRequest(self, printer):
        self.document = QWebEnginePage()
        f = open("test.html","r",encoding="UTF-8",)
        ed = f.read()
        self.document.setHtml(ed)
        self.document.print(printer, self.success)
    
    def success(self, suc):
        print(suc)

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_())

测试.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>A simple, clean, and responsive HTML invoice template</title>

        <style>
            .invoice-box {
                max-width: 800px;
                margin: auto;
                padding: 30px;
                border: 1px solid #eee;
                box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
                font-size: 16px;
                line-height: 24px;
                font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;
                color: #555;
            }

            .invoice-box table {
                width: 100%;
                line-height: inherit;
                text-align: left;
            }

            .invoice-box table td {
                padding: 5px;
                vertical-align: top;
            }

            .invoice-box table tr td:nth-child(2) {
                text-align: right;
            }

            .invoice-box table tr.top table td {
                padding-bottom: 20px;
            }

            .invoice-box table tr.top table td.title {
                font-size: 45px;
                line-height: 45px;
                color: #333;
            }

            .invoice-box table tr.information table td {
                padding-bottom: 40px;
            }

            .invoice-box table tr.heading td {
                background: #eee;
                border-bottom: 1px solid #ddd;
                font-weight: bold;
            }

            .invoice-box table tr.details td {
                padding-bottom: 20px;
            }

            .invoice-box table tr.item td {
                border-bottom: 1px solid #eee;
            }

            .invoice-box table tr.item.last td {
                border-bottom: none;
            }

            .invoice-box table tr.total td:nth-child(2) {
                border-top: 2px solid #eee;
                font-weight: bold;
            }

            @media only screen and (max-width: 600px) {
                .invoice-box table tr.top table td {
                    width: 100%;
                    display: block;
                    text-align: center;
                }

                .invoice-box table tr.information table td {
                    width: 100%;
                    display: block;
                    text-align: center;
                }
            }

            /** RTL **/
            .invoice-box.rtl {
                direction: rtl;
                font-family: Tahoma, 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;
            }

            .invoice-box.rtl table {
                text-align: right;
            }

            .invoice-box.rtl table tr td:nth-child(2) {
                text-align: left;
            }
        </style>
    </head>
    <body>
        <div class="invoice-box">
            <table cellpadding="0" cellspacing="0">
                <tr class="top">
                    <td colspan="2">
                        <table>
                            <tr>
                                <td class="title">
                                    <img src="https://www.sparksuite.com/images/logo.png" style="width: 100%; max-width: 300px" />
                                </td>

                                <td>
                                    Invoice #: 123<br />
                                    Created: January 1, 2015<br />
                                    Due: February 1, 2015
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>

                <tr class="information">
                    <td colspan="2">
                        <table>
                            <tr>
                                <td>
                                    Sparksuite, Inc.<br />
                                    12345 Sunny Road<br />
                                    Sunnyville, CA 12345
                                </td>

                                <td>
                                    Acme Corp.<br />
                                    John Doe<br />
                                    john@example.com
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>

                <tr class="heading">
                    <td>Payment Method</td>

                    <td>Check #</td>
                </tr>

                <tr class="details">
                    <td>Check</td>

                    <td>1000</td>
                </tr>

                <tr class="heading">
                    <td>Item</td>

                    <td>Price</td>
                </tr>

                <tr class="item">
                    <td>Website design</td>

                    <td>$300.00</td>
                </tr>

                <tr class="item">
                    <td>Hosting (3 months)</td>

                    <td>$75.00</td>
                </tr>

                <tr class="item last">
                    <td>Domain name (1 year)</td>

                    <td>$10.00</td>
                </tr>

                <tr class="total">
                    <td></td>

                    <td>Total: $385.00</td>
                </tr>
            </table>
        </div>
    </body>
</html>

几天来,我一直在尝试寻找解决方案,但无济于事,是否有替代 QWebEngine 的方法?

4

0 回答 0