我有一个自定义的QGraphicsItem
,它显示大型(10秒的MB压缩,mutli通道)图像。它现在运行得很好。
这个想法只是当前视图缩放和图形视图端口所需的负载扫描线。并将显示划分为在单独线程中构建的块。paint()
函数只构造这些块并将它们提供给QThreadPool。它还检查并绘制任何已完成的瓷砖。还有更多的代码处理线程/运行表和项之间的事件。但这是最基本的部分。
目标是提供一个响应性的UI。当项目本身更新时,UI不会被阻塞。在我想办法打印之前,一切都很顺利。
问题是,我需要知道对我的画图函数的特定调用是由打印而不是屏幕上的更新产生的。这是需要阻止主线程,直到我的所有瓷砖完成并绘制到画家(或打印页将为空白,因为油漆()返回立即)。
它还有助于调整采样率,因为打印机的分辨率高于屏幕。
因此,我的问题归结为这样一个问题:QPainter
如何才能知道是否传递给my paint()
是一个屏幕还是一台打印机。更好的是,我可以判断调用是用于打印预览还是实际打印?
谢谢。
发布于 2011-02-26 09:59:21
只是一个想法,现在没有打印机来测试它。
在装置()类中有一个QPainter方法,它返回该画家当前正在绘制的画图设备,如果该画家没有活动,则返回0。油漆设备可以由QWidget、QImage、QPixmap、QGLPixelBuffer、QPicture和QPrinter子类实现。所以我相信如果你检查你的设备是否是QPrinter类型的,这就意味着你现在正在打印。
像这样:
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";
希望这能帮上忙
https://stackoverflow.com/questions/5127660
复制