Qt 如何使用QWebView和QPrinter打印简单的HTML表,而不切断右侧?

Qt 如何使用QWebView和QPrinter打印简单的HTML表,而不切断右侧?,qt,webkit,qtwebkit,qwebview,qprinter,Qt,Webkit,Qtwebkit,Qwebview,Qprinter,由于我从Qt4.7.4更新到Qt4.8.7,因此我不可能在不切断右侧的情况下打印简单的HTML表。这是我的PyScript代码,它显示QPrimtPrimeVIEW对话框中的表(问题不与PySead或Pyqt相关,并且可以用C++和Qt复制): 下面是我的简单表格的HTML代码: 桌子{ 宽度:100%; 边界塌陷:塌陷; } 表,td,tr,th{ 边框:0.091米纯灰; } 名字 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏

由于我从Qt4.7.4更新到Qt4.8.7,因此我不可能在不切断右侧的情况下打印简单的HTML表。这是我的PyScript代码,它显示QPrimtPrimeVIEW对话框中的表(问题不与PySead或Pyqt相关,并且可以用C++和Qt复制):

下面是我的简单表格的HTML代码:


桌子{
宽度:100%;
边界塌陷:塌陷;
}
表,td,tr,th{
边框:0.091米纯灰;
}                        
名字
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
姓氏
EndName
吉尔
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
史密斯
恩德

如你所见,桌子的右边不见了

对于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.QtWebKit导入QWebView
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)
def手持打印(自身): dialog=QtGui.QPrintDialog() 如果dialog.exec_389;()==QtGui.QDialog.Accepted: self.handlePaintRequest(dialog.printer()) def handlePaintRequest(自身、打印机): html=”“” 桌子{ 宽度:100%; 边界塌陷:塌陷; } 表,td,tr,th{ 边框:0.091米纯灰; } 名字 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 姓氏 EndName 吉尔 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 史密斯 恩德 """ web_view=QWebView() web_view.setHtml(html) web_视图。打印(打印机)
我用PyQt4.11.4对其进行了测试,发现了相同的行为。那么可能是Qt4.X的问题。顺便说一句,这个问题写得很好。对不起,我不能帮助。@三元我尝试了同样的例子与QT4.8在C++上,也有同样的问题!因此,是的,这个问题与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。简而言之,QTWebKit2.2.2中存在一些奇怪的bug。不幸的是,Qt4.8.7是Qt4的最后一个版本,所以我需要一些解决方法。
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)