繁体   English   中英

如何告诉QGraphicsItem :: paint()被打印?

[英]How can I tell QGraphicsItem::paint() is being called for printing?

我有一个自定义QGraphicsItem显示大(100s的MB压缩,多通道)图像。 它现在工作得很好。

这个想法只是当前视图比例和图形视图端口所需的加载扫描线。 并将显示划分为以单独线程构建的切片。 paint()函数只构造tile并将它们提供给QThreadPool。 它还会检查并绘制已完成的任何图块。 有更多的代码处理线程/ runnables和项目之间的事件。 但这是基本部分。

目标是提供响应式UI。 当项目自行更新时,不会阻止UI。 这一切都很好,直到我试图找出如何打印它。

问题是我需要知道对我的绘图功能的特定调用是由打印而不是屏幕更新引起的。 这需要阻止主线程,直到我的所有瓷砖完成并绘制到画家(或者打印页面将为空,因为paint()立即返回)

它还有助于调整采样率,因为打印机的分辨率高于屏幕。

所以我的问题归结为: 我怎样才能知道QPainter传递给我的paint()是屏幕还是打印机。 更好的是,我可以判断调用是用于打印预览还是实际打印?

谢谢。

只是一个想法,现在没有打印机来测试它。

QPainter类中有一个device()方法,它返回此画家当前正在绘制的绘图设备,如果画家未处于活动状态,则返回0。 绘图设备可以由QWidgetQImageQPixmapQGLPixelBufferQPictureQPrinter子类实现。 所以我相信如果你检查你的设备是否是QPrinter类型,这意味着你现在正在打印。

像这样的Smth:

QPaintDevice* device = painter->device();
if (dynamic_cast<QPrinter*>(device)!=NULL)
    qDebug() << "QPrinter";
else if (dynamic_cast<QWidget*>(device)!=NULL)
    qDebug() << "QWidget";
else if (dynamic_cast<QImage*>(device)!=NULL)
    qDebug() << "QImage";
else if (dynamic_cast<QPixmap*>(device)!=NULL)
    qDebug() << "QPixmap";
else if (dynamic_cast<QPicture*>(device)!=NULL)
    qDebug() << "QPicture";
else
    qDebug() << "something else";

希望这有帮助,问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM