QGraphicsView + QGLWidget problem
Thomas Senyk
thomas.senyk at nokia.com
Tue Jun 5 14:36:42 UTC 2012
Hi,
I'm not sure ... but I think you're doing something horrible wrong :)
You're using QWidget-derived classes (e.g. QLabel) inside a OpenGL-accelerated
QGraphicsView ... right?
If yes, 2 things about that a bad:
1. "using QWidget-derived classes inside QGraphicsView" (unrelated to opengl)
This is wrong, unsupported, evil and makes your application slow :)
This was once mentioned in the qt doc ... but it's gone now. maybe this
features has become better ... but anyway: this is not the way forward! :)
2. "using QtOpenGL to paint QWidget-derived" (via viewport of QGraphicsView)
This is unsupported by Qt and especially on embedded targets, it's not very
well tested and not really maintained.
Even more especially on android. QWidget-opengl-painting isn't fully
implemented (e.g. some widgets need native surfaces; but this feature is not
implemented)
Now the question is: What are you trying to do? :)
If you want a simple (static) qwidget based application: Why use
QGraphicsView?
If you want a fancy (animated) UI: Why use QWidget classes?
If you want both (easy use of QWidget and performance of opengl):
I would go to QtQuick (writing simple UI elements is a matter of minutes)
If you're stuck with old (bad?) code and you can't change your setup
(QGraphicsView + QWidget)
... I guess opengl on android is out of the question at the moment
(you can always go back to SW-rendering by NOT linking against libQtOpenGL)
Greets
Thomas
On Thursday, May 31, 2012 06:17:00 AM ext Steve Pike wrote:
> Hi,
>
> My name is Steve and am new to the mailinglist.
>
> I've submitted a bug report to Sourceforge regarding QGraphicsView +
> QGLWidget under Android. BogDan asked me to join this mailinglist and
> discuss the bug.
>
> For a client I am porting their Qt based software to Android, for use on
> Samsung Galaxy smartphones. Currently the system uses a QGraphicsScene and
> QGraphicsView that is accelerated using a QGLWidget as the viewport, which
> works fine under Ubuntu. Software is written in 100% C++, no QML.
>
> Porting this using Necessitas is a pretty smooth operation and everything
> works perfectly, as long as I don't use a QGLWidget as the viewport. When I
> do use GL acceleration, it seems that embedded widgets created using
> addWidget() are resized to full screen within the QGraphicsView, resulting
> in one widget, for example a label, dominating the screen, the rest being
> invisible.
>
> Temporarily uncommenting the code for this widget will result in another GUI
> element appearing full screen. Getting the dimensions from the widget and
> printing them to debugging output reveals that they are indeed resized to
> screen dimensions and I cannot override this using setGeometry.
>
> I'm an experienced C/C++ hacker, so I will not only present my problem, but
> will hopefully solve it as well.
>
> Yesterday, I found the following clues in the qandroideglfswindow.cpp and I
> looks like it is linked to my problem.
>
>
> https://qt.gitorious.org/~taipan/qt/android-lighthouse/blobs/stable/src/plug
> ins/platforms/android/src/opengl/qandroideglfswindow.cpp
>
>
> Specifically:
>
> void QAndroidEglFSWindow::setGeometry(const QRect &)
> {
> // We only support full-screen windows
> QRect rect(m_screen->availableGeometry());
> QWindowSystemInterface::handleGeometryChange(this->widget(), rect);
>
> // Since toplevels are fullscreen, propegate the screen size back to the
> widget widget()->setGeometry(rect);
>
> QPlatformWindow::setGeometry(rect);
> }
>
>
> ...
>
> Qt::WindowFlags QAndroidEglFSWindow::setWindowFlags(Qt::WindowFlags type)
> {
> flags = type;
>
> if (!widget()->isFullScreen() && flags != Qt::Popup && flags != Qt::Tool
> && flags != Qt::ToolTip && flags != Qt::SplashScreen)
> widget()->setWindowState(widget()->windowState() |
> Qt::WindowMaximized); return flags;
> }
>
>
> In alpha4 there are some more modifications to this function that have to do
> with maximizing widgets:
>
> QtAndroid::setFullScreen(widget());
>
>
> I think the problem is this:
>
> When a widget is created without a parent, for example using 'new QLabel()',
> the OpenGL window code makes it a full-screen top level window, even though
> it is not shown yet.
>
> If later I use addWidget() to embed this widget into a QGraphicsScene, which
> is the normal way to go, this widget stays full screen and seems to keep
> its window status. I thought the solution would be to create widgets with
> the QGraphicsView or a dummy widget as the parent, but this is not possible
> as addWidget() will not allow you to embed widgets that already have a
> parent. Workarounds have failed, such as creating my GUI elements with
> window flags like Qt::Tool, to prevent them being made full screen, or
> removing the Qt::Window status after creating the widget.
>
> These restrictions are not in the raster code. I hope anyone has some ideas
> about this.
>
> Steve
>
>
>
> Steve Pike
>
> _______________________________________________
> Necessitas-devel mailing list
> Necessitas-devel at kde.org
> https://mail.kde.org/mailman/listinfo/necessitas-devel
More information about the Necessitas-devel
mailing list