0

QGraphicsItem大きな (数百 MB の圧縮されたマルチチャネル) 画像を表示するカスタムがあります。現在、かなりうまく機能しています。

アイデアは、現在のビュー スケールとグラフィックス ビュー ポートに必要なスキャンラインのみをロードすることです。そして、ディスプレイを別々のスレッドで構築されたタイルに分割します。このpaint()関数は、タイルを構築して QThreadPool に供給するだけです。また、完了したタイルをチェックして描画します。スレッド/ランナブルとアイテムの間のイベントを処理するコードがさらにあります。しかし、これは基本的な部分です。

目標は、レスポンシブ UI を提供することです。アイテムがそれ自体を更新している場合、UI はブロックされません。印刷方法を理解しようとするまで、すべてうまくいきます。

問題は、ペイント関数への特定の呼び出しが、画面上の更新ではなく印刷の結果であることを知る必要があることです。これは、すべてのタイルが完了してペインターにプロットされるまでメイン スレッドをブロックするために必要です (または、paint() がすぐに戻るため、印刷されたページは空白になります)。

プリンターは画面よりも解像度が高いため、サンプルレートを調整するのにも役立ちます。

したがって、私の質問は次のようになります: my に渡されたがスクリーンまたはプリンターであるかどうかを確認するにはどうすればよいですか。いっそのこと、呼び出しが印刷プレビューか実際の印刷かを判断できますか?QPainterpaint()

ありがとう。

4

1 に答える 1

2

単なるアイデアです。現在、テストするためのプリンターがありません。

QPainterクラスにはdevice()メソッドがあり、このペインタが現在ペイントしているペイント デバイスを返すか、ペインタがアクティブでない場合は 0 を返します。ペイント デバイスは、 QWidgetQImageQPixmapQGLPixelBufferQPicture、および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";

これが役に立てば幸いです、よろしく

于 2011-02-26T17:59:21.027 に答える