【问题标题】:How to print a simple HTML table with QWebView and QPrinter without cutting off the right side?如何使用 QWebView 和 QPrinter 打印简单的 HTML 表格而不切断右侧?
【发布时间】:2017-08-13 08:57:50
【问题描述】:

自从我从 Qt 4.7.4 更新到 Qt 4.8.7 后,我无法在不切断右侧的情况下打印简单的 HTML 表格。这是我在 QPrintPreviewDialog 中显示表格的 PySide 代码(该问题与 PySide 或 PyQt 无关,您可以使用 C++ 和 Qt 重现它):

app = QtGui.QApplication(sys.argv)

webView = QWebView()            
webView.load(QtCore.QUrl('table.html'))

printer = QtGui.QPrinter()
printer.setPaperSize(QtGui.QPrinter.A4)

printPreview = QtGui.QPrintPreviewDialog(printer)    
printPreview.paintRequested.connect(webView.print_)

#Avoid blank preview on startup                    
QtGui.QApplication.processEvents()

printPreview.show()        
app.exec_()

这是我的简单表格的 HTML 代码:

<!DOCTYPE html>  
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">    
    <style>
        table {
            width:100%;
            border-collapse:collapse;
        }
        table, td, tr, th{
            border:0.091em solid grey;                 
        }                        
    </style>
</head>

<body>
 <table>
  <tr>
    <th>Firstname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>ENDENAME</th>

  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td>
    <td>Smith</td>    
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>ENDE</td>
  </tr>
</table>
</body> 
</html>

如您所见,表格的右侧不见了。

使用 Qt 4.7.4,结果是正确的,这里是截图:

我试图自己调查这个问题。我发现,如果 printer.pageRect().size().width() 和 webView.page().mainFrame().contentsSize().width() 之间的比率低于 0.5,则会发生切割(在 96打印机和屏幕的 DPI)。如果 DPI 值不同,则必须将两个值都转换为英寸以获得正确的比率。

    contentSize = webView.page().mainFrame().contentsSize().width()        
    pageSize = printer.pageRect().size().width()

    pageWidthNorm = float(pageWidth)/float(printer.resolution())
    contentWidthNorm = contentSize.width() / horizontalDpi

    #Cutting off at 0.5     
    magicFactor = float(pageWidthNorm)/float(contentWidthNorm)

但是,我无法使用此信息解决此问题。我尝试将此 magicFactor 设置为 QWebView 的 zoomFactor 并且它可以工作。但是结果很丑,不是我想要的。

我希望有人可以帮助我。谢谢你。

【问题讨论】:

  • 我用 PyQt4.11.4 对其进行了测试,我看到了相同的行为。那么可能是Qt4.X的问题。顺便提一句。写得很好的问题。抱歉,我帮不上忙。
  • @Trilarion 我在 C++ 上使用 Qt 4.8.7 尝试了相同的示例,但出现了同样的问题!所以,是的,这个问题与 PyQt 或 PySide 无关。这是一个Qt问题。我从 PySide 1.1.1 升级到 1.2.4 将我的 Qt 版本从 4.7.4 更改为 Qt 4.8.7。根据 Qt 更新日志,他们还将 QtWebkit 从 1.x 升级到 2.2.2。所以简而言之,QtWebkit 2.2.2 中存在一些奇怪的错误。不幸的是,Qt 4.8.7 是 Qt 4 的最后一个版本,所以我需要某种解决方法。

标签: qt webkit qtwebkit qwebview qprinter


【解决方案1】:
from PyQt4.QtWebKit import QWebView
def handlePrint(self):
    dialog = QtGui.QPrintDialog()
    if dialog.exec_() == QtGui.QDialog.Accepted:
        self.handlePaintRequest(dialog.printer())


def handlePaintRequest(self, printer):
    html = """
<!DOCTYPE html>  
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">    
    <style>
        table {
            width:100%;
            border-collapse:collapse;
        }
        table, td, tr, th{
            border:0.091em solid grey;                 
        }                        
    </style>
</head>

<body>
 <table>
  <tr>
    <th>Firstname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>Lastname</th>
    <th>ENDENAME</th>

  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td>
    <td>Smith</td>    
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>Smith</td>
    <td>ENDE</td>
  </tr>
</table>
</body> 
</html>
"""
    web_view = QWebView()
    web_view.setHtml(html)
    web_view.print_(printer)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 2018-12-13
    • 2015-05-17
    • 2011-03-17
    • 2017-01-03
    • 2018-08-12
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多