我有一个自定义QGraphicsItem
,可以显示大(100个MB压缩,多通道)图像。它现在工作得很好。
这个想法只是加载当前视图比例和图形视图端口所需的扫描线。并将显示划分为以单独线程构建的切片。 paint()
函数仅构造切片并将其提供给QThreadPool。它还会检查并绘制已完成的任何图块。有更多的代码处理线程/ runnables和项目之间的事件。但这是基本部分。
目标是提供响应式用户界面。当项目自行更新时,不会阻止UI。这一切都很好,直到我试图找出如何打印它。
问题是我需要知道对我的绘图功能的特定调用是由打印而不是屏幕更新引起的。这需要阻止主线程,直到我的所有图块完成并绘制到画家(或者打印页面将为空,因为paint()立即返回)
由于打印机的分辨率高于屏幕,因此调整采样率也很有帮助。
所以我的问题归结为:如何判断传递给QPainter
的{{1}}是屏幕还是打印机。更好的是,我可以判断调用是用于打印预览还是实际打印?
感谢。
答案 0 :(得分:2)
只是一个想法,现在没有打印机来测试它。
QPainter 类中有一个device()方法,它返回此画家当前正在绘制的绘图设备,如果画家未处于活动状态,则返回0。绘图设备可以通过 QWidget , QImage , QPixmap , QGLPixelBuffer , QPicture ,和 QPrinter 子类。所以我相信如果您要检查您的设备是否为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";
希望这有帮助,尊重