私はQGraphicsItemを追加するQGraphicsSceneを持っています。 QGraphicsItemの中で、OpenGL ES 2.0のhello triangleの例で使われている三角形を描画します。問題は、QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
関数以外のどこでもシェーダを作成してコンパイルしても、コンパイルされないということです。 GLレンダリングコンテキストをアクティブにしておく必要があることはわかっていますが、ビューポートをGLWidgetに設定してもそれは起こりません。私はQGraphicsItemコンストラクタやQGraphicsSceneでそれらをコンパイルし、QGraphicsItemを親として設定するなど、さまざまなことを試しました(私は非常にばかげたことですが、明らかに何も動作しません)。 QGraphicsItemクラスの中にinitShaders()関数を作成して、シーン内にアイテムが作成された後にinitShaders()関数を作成して呼び出すこともできましたが、これも機能しませんでした。QGraphicsItemのシェーダプログラムを作成する
1
A
答えて
2
QGraphicsViewの派生クラスを作成します。 setupViewport(QWidget *ビューポート)をオーバーライドしてシェーダを初期化します。これにより、シェーダのコンパイル時にコンテキストが最新であることを確認できます。ただし、グラフィックビューで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();
}
}
関連する問題
:-)ありがとう、ありがとう、ありがとう!私は実際にそれを実際にはしませんでしたが、あなたは私にアイデアを与えて、私は書いた: 'int main(int argc、char * argv []){ QApplication a(argc、argv); GraphicsScene gScene; GraphicsViewビュー; QGLWidget * myWidget =新しいQGLWidget(QGLFormat(QGL :: SampleBuffers)); view.setViewport(myWidget); myWidget-> makeCurrent(); myGraphicsItem * triangle = new myGraphicsItem(); triangle-> initShaders(); gScene.addItem(triangle); view.setScene(&gScene); view.showMaximized(); return a.exec(); } ' とそれが働いた!ありがとうございました! – Sassa
QGraphicsItemにはまだinitShaders()がありますが、今回は 'view.setViewport(myWidget);の後に呼びます。 myWidget-> makeCurrent(); 'であり、前にはありません。ああ、愚かさ – Sassa