1

QWidgetに表示されるピクセルを取得し、処理を行ってから、処理されたピクセルを表示する方法はありますか?

paintEvent()の制限を克服できないようです。誰かが助けてくれることを願っています。

QPixmap::grabWidgetとQWidget::renderは必要なピクセルを取得しますが、paintEvent()内から呼び出すことはできません。これを行うと、無限ループがトリガーされるためです。

タイマーの実行、スナップショットの作成、処理の実行、強制的な再描画、および保存された画像の表示を試みました。これはある程度機能しますが、動的コンテンツ(つまり移動)では無残に失敗します。

paintEvent()内からこれを実行できる必要があります。

これを行う方法はありますか?

4

1 に答える 1

1

ウィジェットを(ペイントイベント内で)ピックスマップにレンダリングし、ピックスマップで処理を行い、その後結果をウィジェットにレンダリングすることで、問題が最も解決されるように思えます。

void MySuperAwesomeWidget::paintEvent(QPaintEvent* event)
{
   QPixmap pixmap(size());
   QPainter painter;

   painter.begin(&pixmap);
   // Drawing code goes here
   painter.end();

   // Do processing on pixmap here

   painter.begin(this);
   painter.drawPixmap(0, 0, pixmap);
   painter.end();
}

通常、私が説明した手法は不要 (または望ましくない) と見なされます。これは、本質的にはダブル バッファリングの形式であり、バックグラウンドでQWidget 既にダブル バッファリングを提供しているためです。ただし、あなたの場合、最終的なレンダリングを実行する前に、図面に対して何らかの処理を行っています。そのため、これはおそらく最良のアプローチです。

于 2012-10-24T23:03:00.580 に答える