【问题标题】:How can I tell QGraphicsItem::paint() is being called for printing?我怎么知道 QGraphicsItem::paint() 正在被调用打印?
【发布时间】:2011-02-26 15:09:18
【问题描述】:

我有一个自定义的QGraphicsItem,它可以显示大(100 多个 MB 压缩、多通道)图像。它现在运行良好。

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

目标是提供响应式 UI。当项目自行更新时,UI 不会被阻止。在我试图弄清楚如何打印之前,一切都很好。

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

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

所以我的问题归结为:如何确定传递给我的paint()QPainter 是屏幕还是打印机。更好的是,我可以判断调用是用于打印预览还是实际打印?

谢谢。

【问题讨论】:

    标签: c++ qt printing qgraphicsitem qpainter


    【解决方案1】:

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

    QPainter 类中有一个device() 方法,它返回此画家当前正在绘制的绘制设备,如果画家不活动,则返回 0。绘制设备可以由QWidgetQImageQPixmapQGLPixelBufferQPicture实现em> 和 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";
    

    希望这会有所帮助,问候

    【讨论】:

    • 谢谢。我想这样做,但想知道是否有其他方法。现在来弄清楚如何判断它是否是预览打印。
    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多