QGraphicsItem を追加する QGraphicsScene があります。QGraphicsItem 内で、OpenGL ES 2.0 の hello 三角形の例で使用される三角形をレンダリングします。問題は、関数以外の場所でシェーダーを作成してコンパイルすると、コンパイルQGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
されないことです。GL レンダリング コンテキストをアクティブにする必要があることはわかっていますが、ビューポートを GLWidget に設定すると発生しませんか?? QGraphicsItem コンストラクターまたは QGraphicsScene でそれらをコンパイルし、QGraphicsItem を親として設定するなど、さまざまなことを試しました (これは非常に愚かなことだとわかりました) が、(明らかに) 何も機能しません。QGraphicsItem クラス内に initShaders() 関数を作成し、シーンでアイテムが作成された後に呼び出すことが最も論理的であると思われましたが、これもうまくいきませんでした。
1550 次
1 に答える
3
QGraphicsViewの派生クラスを作成します。setupViewport(QWidget * viewport)をオーバーライドして、シェーダーを初期化します。これにより、シェーダーをコンパイルするときにコンテキストが最新であることを確認できます。ただし、グラフィックビューでsetViewport()が呼び出される前に、アイテムをシーンに追加する必要があります。
void MyGraphicsView::setupViewport(QWidget *viewport)
{
QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
if (glWidget) {
glWidget->makeCurrent();
foreach (QGraphicsItem *item, scene()->items())
{
MyGraphicsShaderItem *glItem = qgraphicsitem_cast<MyGraphicsShaderItem*>(item);
if (glItem)
glItem->initShader();
}
glWidget->doneCurrent();
}
}
于 2011-06-16T08:26:55.507 に答える