سؤال

لقد اشتقت من QGlwidget من قبل، مثل ذلك:

class MyGLWidget : public QGLWidget
{
public:
   // stuff...

   virtual void initializeGL() { /* my custom OpenGL initialization routine */ }

   // more stuff...
};

ومع ذلك، أجد أنه إذا حاولت تهيئة QGRAPHISVIVEVIVEVIVED مع QGRAPHISVIVEVIOVE الخاص بي Custom QGlWIDGED ك ViewPort، فلن يتم استدعاء IctionizeGL (إعداد نقطة توقف داخل مكتبة كيو تي، ولا qglwidget :: iiticizegl () عند إنشاء عادي).

// initializeGL, resizeGL, paintGL not called
ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));

// initializeGL, resizeGL, paintGL *still* not called
ui.graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer)));

أين هو الموقع الصحيح لتقديم التعليمات البرمجية الموجودة حاليا في MyGlwidget :: InititionizeGl ()؟

هل كانت مفيدة؟

المحلول 5

سأذهب إلى الأمام وأجب عن سؤالي الخاص. هذا ليس مثاليا، ولكن هذه هي الطريقة التي حصلت عليها حول المشكلة.

بدلا من

ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));

لقد حصلت على هذا بدلا من ذلك:

ui.graphicsView->setViewport(new QGLWidget(new CustomContext(QGLFormat(QGL::SampleBuffers))));

CustomContext هو فئة مستمدة من QGLContext. لقد تجاوزت العضو الخلق، مثل ذلك:

virtual bool create(const QGLContext *shareContext = 0)
{
    if(QGLContext::create(shareContext))
    {
        makeCurrent();

        /* do my initialization here */

        doneCurrent();

        return true;
    }

    return false;
}

لا أعتقد أن هذه هي الطريقة المثلى للقيام بذلك، ولكنها أفضل من البديل عدم وجود خطوة تهيئة محددة على الإطلاق. ما زلت سعداء أن يكون هناك شخص يترك إجابة أفضل!

نصائح أخرى

يمكن استخدام فتحة SetupViewPort الخاصة ب QGRAPHISVIVEVEVIVEVIVED مخصص لاستدعاء تحديثات تحديثات () على QGLWIDGET، والتي ستتسبب في استدعاء InitoilizeGL ().

class MyGraphicsView : public QGraphicsView
{
    //... The usual stuff

protected slots:
    virtual void setupViewport(QWidget *viewport)
    {
        QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
        if (glWidget)
            glWidget->updateGL();
    }

};

إذن ما وجدته هو qgraphicsView يقوم بتثبيت Eventfilter مخصص على qglwidget Viewport لذلك لا يرى أبدا أحداث تهيئة / تغيير حجم / إعادة طلاء. ربما تم القيام بذلك لجعله يعمل بشكل صحيح مع العيب () إلخ.

أفضل دقتي الحالية هي التقاط الحدث المطلوب إما في QGRAPHISSVIEVVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVEVENT () / إلخ، أو تثبيت EventFilter مخصص على فئة QGLWIDGET الخاصة بك للقبض على الأحداث تغيير حجم / الطلاء / إلخ قبل EvgraphicsView

الألم، الألم، ... دمج الحاجيات المستمدة من QGLWIDGETS إلى QGRAPHISPVIEW ليس المتعة، وأجزاء من كيو تي أعرف أن هذه هي بالتأكيد واحدة من المناطق المهنية. انتهى بي الأمر باستخدام جزء من kgllib. (من KDE) تسمى widgetProxy هذا مجمع لائق للغاية حول QGlwidget. قمت بتعديله لتناسب احتياجاتي ولكنني يعمل بشكل جيد بشكل معقول بالنسبة لمعظم الحالات العامة حيث تريد استخدام فئة إخراج مشتق من QGLWIDGET داخل QGRAPHISVIVEVIVEW ورسم أشياء أخرى على رأسه.

initializeGL() لن يسمى حتى الدعوة الأولى إلى أي paintGL() أو resizeGL() وليس عند إنشاء القطعة. قد يحدث هذا في وقت متأخر كما عندما يتم وضع القطعة مرئية لأول مرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top