缩放和打印 PyQt
Scaling and printing PyQt
我正在尝试将主 window 及其小部件打印到纸上。理想情况下,它应该适合页面。
我尝试了以下代码但无济于事!有人知道怎么做吗?
def printViewCustomer(self):
printer=QtPrintSupport.QPrinter()
dialog=QtPrintSupport.QPrintDialog(printer,self)
if (dialog.exec_()!=QtWidgets.QDialog.Accepted):
return
printWidget=self.mainViewWidget
painter=QtGui.QPainter(printer)
painter.begin(printer)
print(printer.paperRect().x())
XScale=(printer.pageRect().width()/ (printWidget.width()))
YScale=(printer.pageRect().height()/(printWidget.height()))
Scale=(min(XScale,YScale))
painter.translate((printer.paperRect().x()) + (printer.pageRect().width()/2),(printer.paperRect().y) + (printer.pageRect().height()/2))
painter.scale(Scale,Scale)
painter.translate(-1*printWidget.width()/2,-1*printWidget.height()/2)
printWidget.render(painter)
painter.end()
这是对这个
的尝试翻译
QPainter painter;
painter.begin(&printer);
double xscale = printer.pageRect().width()/double(myWidget->width());
double yscale = printer.pageRect().height()/double(myWidget->height());
double scale = qMin(xscale, yscale);
painter.translate(printer.paperRect().x() + printer.pageRect().width()/2,
printer.paperRect().y() + printer.pageRect().height()/2);
painter.scale(scale, scale);
painter.translate(-width()/2, -height()/2);
myWidget->render(&painter);
我们来思考错误:
TypeError: unsupported operand type(s) for +: 'builtin_function_or_method' and 'float'
在我们做任何事情之前,请阅读它。 "unsupported operand types for +"。好吧,这听起来像是 Python 正在尝试添加两个内容,但其中一个无法添加。多读一点,'builtin_function_or_method'和'float'。听起来您正在尝试向 method/function 添加一个浮点数,这没有任何意义。
所以只是为了修复您遇到的错误:
painter.translate((printer.paperRect().x()) + (printer.pageRect().width()/2),(printer.paperRect().y) + (printer.pageRect().height()/2))
应该是
painter.translate((printer.paperRect().x()) + (printer.pageRect().width()/2), (printer.paperRect().y()) + (printer.pageRect().height()/2))
请注意,您忘记了 调用 函数 y,而是尝试使用 y 的值,它是指向该函数的指针。您可能会忘记 Qt 使用方法来访问像这样的变量。允许 properties 访问可能更像 pythonic,但这是自 PySide/PyQt 包装 C++ 以来的情况。
一旦您发布了错误,就很清楚您的代码出了什么问题 - 请尽量记住在以后包含此类内容以节省其他人的时间。
现在怎么样了?
我正在尝试将主 window 及其小部件打印到纸上。理想情况下,它应该适合页面。 我尝试了以下代码但无济于事!有人知道怎么做吗?
def printViewCustomer(self):
printer=QtPrintSupport.QPrinter()
dialog=QtPrintSupport.QPrintDialog(printer,self)
if (dialog.exec_()!=QtWidgets.QDialog.Accepted):
return
printWidget=self.mainViewWidget
painter=QtGui.QPainter(printer)
painter.begin(printer)
print(printer.paperRect().x())
XScale=(printer.pageRect().width()/ (printWidget.width()))
YScale=(printer.pageRect().height()/(printWidget.height()))
Scale=(min(XScale,YScale))
painter.translate((printer.paperRect().x()) + (printer.pageRect().width()/2),(printer.paperRect().y) + (printer.pageRect().height()/2))
painter.scale(Scale,Scale)
painter.translate(-1*printWidget.width()/2,-1*printWidget.height()/2)
printWidget.render(painter)
painter.end()
这是对这个
的尝试翻译QPainter painter;
painter.begin(&printer);
double xscale = printer.pageRect().width()/double(myWidget->width());
double yscale = printer.pageRect().height()/double(myWidget->height());
double scale = qMin(xscale, yscale);
painter.translate(printer.paperRect().x() + printer.pageRect().width()/2,
printer.paperRect().y() + printer.pageRect().height()/2);
painter.scale(scale, scale);
painter.translate(-width()/2, -height()/2);
myWidget->render(&painter);
我们来思考错误:
TypeError: unsupported operand type(s) for +: 'builtin_function_or_method' and 'float'
在我们做任何事情之前,请阅读它。 "unsupported operand types for +"。好吧,这听起来像是 Python 正在尝试添加两个内容,但其中一个无法添加。多读一点,'builtin_function_or_method'和'float'。听起来您正在尝试向 method/function 添加一个浮点数,这没有任何意义。
所以只是为了修复您遇到的错误:
painter.translate((printer.paperRect().x()) + (printer.pageRect().width()/2),(printer.paperRect().y) + (printer.pageRect().height()/2))
应该是
painter.translate((printer.paperRect().x()) + (printer.pageRect().width()/2), (printer.paperRect().y()) + (printer.pageRect().height()/2))
请注意,您忘记了 调用 函数 y,而是尝试使用 y 的值,它是指向该函数的指针。您可能会忘记 Qt 使用方法来访问像这样的变量。允许 properties 访问可能更像 pythonic,但这是自 PySide/PyQt 包装 C++ 以来的情况。
一旦您发布了错误,就很清楚您的代码出了什么问题 - 请尽量记住在以后包含此类内容以节省其他人的时间。
现在怎么样了?