Uploaded image for project: 'Qt Solutions'
  1. Qt Solutions
  2. QTSOLBUG-36

QGLWidget in an qtbrowserplugin does not work on Mac / OSX

    XMLWordPrintable

Details

    • Bug
    • Resolution: Out of scope
    • Not Evaluated
    • Not Scheduled
    • No Version
    • BrowserPlugin
    • None

    Description

      When placing a QGLWidget in an solutions qtbrowserplugin plugin
      the GL window is not drawn in the correct place or size on the page when viewed on a Mac / OSX browser.

      It is also strangely clipped as the browser window is resized.

      Note :
      The supported platforms of the QtBrowserPlugin are listed on this page : http://doc.trolltech.com/solutions/4/qtbrowserplugin/
      which mentions MacOS X support is experimental.

      The following code replaces the trivial.cpp in the trivial plugin demonstration and demonstrates the issue when visiting the URL :

      http://doc.trolltech.com/solutions/4/qtbrowserplugin/qtbrowserplugin-example-trivial.html

      Same code works fine on windows.

      #include <QtGui>
      #include <qtbrowserplugin.h>
      #include <QGLWidget>
      #include <QBoxLayout>
      #include <math.h>

      class GLWidget : public QGLWidget
      {
      Q_OBJECT

      public:
      GLWidget(QWidget *parent = 0);
      ~GLWidget();

      QSize minimumSizeHint() const;
      QSize sizeHint() const;

      public slots:
      void setXRotation(int angle);
      void setYRotation(int angle);
      void setZRotation(int angle);

      signals:
      void xRotationChanged(int angle);
      void yRotationChanged(int angle);
      void zRotationChanged(int angle);

      protected:
      void initializeGL();
      void paintGL();
      void resizeGL(int width, int height);
      void mousePressEvent(QMouseEvent *event);
      void mouseMoveEvent(QMouseEvent *event);

      private:
      GLuint makeObject();
      void quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2,
      GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4);
      void extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
      void normalizeAngle(int *angle);

      GLuint object;
      int xRot;
      int yRot;
      int zRot;
      QPoint lastPos;
      QColor trolltechGreen;
      QColor trolltechPurple;
      };

      GLWidget::GLWidget(QWidget *parent)
      : QGLWidget(parent)
      {
      object = 0;
      xRot = 0;
      yRot = 0;
      zRot = 0;

      trolltechGreen = QColor::fromCmykF(0.40, 0.0, 1.0, 0.0);
      trolltechPurple = QColor::fromCmykF(0.39, 0.39, 0.0, 0.0);
      }

      GLWidget::~GLWidget()
      {
      makeCurrent();
      glDeleteLists(object, 1);
      }

      QSize GLWidget::minimumSizeHint() const
      {
      return QSize(50, 50);
      }

      QSize GLWidget::sizeHint() const
      {
      return QSize(400, 400);
      }

      void GLWidget::setXRotation(int angle)
      {
      normalizeAngle(&angle);
      if (angle != xRot)

      { xRot = angle; emit xRotationChanged(angle); updateGL(); }

      }

      void GLWidget::setYRotation(int angle)
      {
      normalizeAngle(&angle);
      if (angle != yRot)

      { yRot = angle; emit yRotationChanged(angle); updateGL(); }

      }

      void GLWidget::setZRotation(int angle)
      {
      normalizeAngle(&angle);
      if (angle != zRot)

      { zRot = angle; emit zRotationChanged(angle); updateGL(); }

      }

      void GLWidget::initializeGL()
      {
      setAutoFillBackground(false);
      qglClearColor(trolltechPurple.dark());
      object = makeObject();
      glShadeModel(GL_FLAT);
      glEnable(GL_DEPTH_TEST);
      glEnable(GL_CULL_FACE);
      }

      void GLWidget::paintGL()
      {
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glLoadIdentity();
      glTranslated(0.0, 0.0, -10.0);
      glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
      glRotated(yRot / 16.0, 0.0, 1.0, 0.0);
      glRotated(zRot / 16.0, 0.0, 0.0, 1.0);
      glCallList(object);
      }

      void GLWidget::resizeGL(int width, int height)
      {
      int side = qMin(width, height);
      glViewport((width - side) / 2, (height - side) / 2, side, side);

      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
      glMatrixMode(GL_MODELVIEW);
      }

      void GLWidget::mousePressEvent(QMouseEvent *event)
      {
      lastPos = event->pos();
      }

      void GLWidget::mouseMoveEvent(QMouseEvent *event)
      {
      int dx = event->x() - lastPos.x();
      int dy = event->y() - lastPos.y();

      if (event->buttons() & Qt::LeftButton)

      { setXRotation(xRot + 8 * dy); setYRotation(yRot + 8 * dx); }

      else if (event->buttons() & Qt::RightButton)

      { setXRotation(xRot + 8 * dy); setZRotation(zRot + 8 * dx); }

      lastPos = event->pos();
      }

      GLuint GLWidget::makeObject()
      {
      GLuint list = glGenLists(1);
      glNewList(list, GL_COMPILE);

      glBegin(GL_QUADS);

      GLdouble x1 = +0.06;
      GLdouble y1 = -0.14;
      GLdouble x2 = +0.14;
      GLdouble y2 = -0.06;
      GLdouble x3 = +0.08;
      GLdouble y3 = +0.00;
      GLdouble x4 = +0.30;
      GLdouble y4 = +0.22;

      quad(x1, y1, x2, y2, y2, x2, y1, x1);
      quad(x3, y3, x4, y4, y4, x4, y3, x3);

      extrude(x1, y1, x2, y2);
      extrude(x2, y2, y2, x2);
      extrude(y2, x2, y1, x1);
      extrude(y1, x1, x1, y1);
      extrude(x3, y3, x4, y4);
      extrude(x4, y4, y4, x4);
      extrude(y4, x4, y3, x3);

      const double Pi = 3.14159265358979323846;
      const int NumSectors = 200;

      for (int i = 0; i < NumSectors; ++i)

      { double angle1 = (i * 2 * Pi) / NumSectors; GLdouble x5 = 0.30 * sin(angle1); GLdouble y5 = 0.30 * cos(angle1); GLdouble x6 = 0.20 * sin(angle1); GLdouble y6 = 0.20 * cos(angle1); double angle2 = ((i + 1) * 2 * Pi) / NumSectors; GLdouble x7 = 0.20 * sin(angle2); GLdouble y7 = 0.20 * cos(angle2); GLdouble x8 = 0.30 * sin(angle2); GLdouble y8 = 0.30 * cos(angle2); quad(x5, y5, x6, y6, x7, y7, x8, y8); extrude(x6, y6, x7, y7); extrude(x8, y8, x5, y5); }

      glEnd();

      glEndList();
      return list;
      }

      void GLWidget::quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2,
      GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4)
      {
      qglColor(trolltechGreen);

      glVertex3d(x1, y1, -0.05);
      glVertex3d(x2, y2, -0.05);
      glVertex3d(x3, y3, -0.05);
      glVertex3d(x4, y4, -0.05);

      glVertex3d(x4, y4, +0.05);
      glVertex3d(x3, y3, +0.05);
      glVertex3d(x2, y2, +0.05);
      glVertex3d(x1, y1, +0.05);
      }

      void GLWidget::extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
      {
      qglColor(trolltechGreen.dark(250 + int(100 * x1)));

      glVertex3d(x1, y1, +0.05);
      glVertex3d(x2, y2, +0.05);
      glVertex3d(x2, y2, -0.05);
      glVertex3d(x1, y1, -0.05);
      }

      void GLWidget::normalizeAngle(int *angle)
      {
      while (*angle < 0)
      *angle += 360 * 16;
      while (*angle > 360 * 16)
      *angle -= 360 * 16;
      }

      class Trivial : public QWidget
      {
      Q_OBJECT
      Q_PROPERTY(QString text READ text WRITE setText)

      Q_CLASSINFO("ClassID", "

      {5a22176d-118f-4185-9653-9f98958a6df8}

      ")
      Q_CLASSINFO("InterfaceID", "

      {2df735ba-da4f-4fb7-8f35-b8dfbf8cfd9a}

      ")
      Q_CLASSINFO("EventsID", "

      {449de213-f8bd-4d2e-a2cf-eab407c03245}

      ")

      Q_CLASSINFO("MIME", "trivial/very:xxx:Trivial and useless")
      Q_CLASSINFO("ToSuperClass", "Trivial")
      Q_CLASSINFO("DefaultProperty", "text")

      public:
      Trivial(QWidget *parent = 0)
      : QWidget(parent)

      { new QVBoxLayout(this); layout()->addWidget(new GLWidget()); }

      void mousePressEvent(QMouseEvent *)

      { mouseDown(); }

      void mouseMoveEvent(QMouseEvent *e)

      { mouseMove(e->x(), e->y()); }

      void mouseReleaseEvent(QMouseEvent*)

      { mouseUp(); }

      QString text() const

      { return m_text; }

      public slots:
      void about()

      { QMessageBox::aboutQt(this); }

      void setText(const QString &text)

      { m_text = text; update(); }

      signals:
      void mouseDown();
      void mouseMove(int x, int y);
      void mouseUp();

      protected:

      private:
      QString m_text;
      };

      #include "trivial.moc"

      QTNPFACTORY_BEGIN("Trivial Qt-based Plugin", "A Qt-based LiveConnected plug-in that does nothing")
      QTNPCLASS(Trivial)
      QTNPFACTORY_END()

      #ifdef QAXSERVER
      #include <ActiveQt/QAxFactory>
      QAXFACTORY_BEGIN("

      {aa3216bf-7e20-482c-84c6-06167bacb616}

      ", "

      {08538ca5-eb7a-4f24-a3c4-a120c6e04dc4}

      ")
      QAXCLASS(Trivial)
      QAXFACTORY_END()
      #endif

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            vgt Eirik Aavitsland
            dettman Dean Dettman (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes