06/15/10 15:57:44 (7 years ago)

From Jean-Sebastien Guay, "I've been working in the last few days
to get QWidgetImage to a point where it can fill a need we have: to be
able to use Qt to make HUDs and to display widgets over / inside an OSG

Current results

I've attached what I have at this point. The modified QWidgetImage +
QGraphicsViewAdapter classes can be rendered fullscreen (i.e. the Qt
QGraphicsView's size follows the size of the OSG window) or on a quad in
the scene as before. It will let events go through to OSG if no widget
is under the mouse when they happen (useful when used as a HUD with
transparent parts - a click-focus scheme could be added later too). It
also supercedes Martin Scheffler's submission because it adds a
getter/setter for the QGraphicsViewAdapter's background color (and the
user can set their widget to be transparent using
widget->setAttribute(Qt::WA_TranslucentBackground) themselves).

The included osgQtBrowser example has been modified to serve as a test
bed for these changes. It has lots more command line arguments than
before, some of which can be removed eventually (once things are
tested). Note that it may be interesting to change its name or split it
into two examples. Though if things go well, the specific QWebViewImage
class can be removed completely and we can consolidate to using
QWidgetImage everywhere, and then a single example to demonstrate it
would make more sense, albeit not named osgQtBrowser... You can try this
path by using the --useWidgetImage --useBrowser command line arguments -
this results in an equivalent setup to QWebViewImage, but using
QWidgetImage, and doesn't work completely yet for some unknown reason,
see below.

Remaining issues

There are a few issues left to fix, and for these I request the
community's assistance. They are not blockers for me, and with my
limited Qt experience I don't feel like I'm getting any closer to fixing
them, so if someone else could pitch in and see what they can find, it
would be appreciated. It would be really nice to get them fixed, that
way we'd really have a first-class integration of Qt widgets in an OSG
scene. The issues are noted in the osgQtBrowser.cpp source file, but
here they are too:

QWidgetImage still has some issues, some examples are:

  1. Editing in the QTextEdit doesn't work. Also when started with
    --useBrowser, editing in the search field on YouTube? doesn't
    work. But that same search field when using QWebViewImage
    works... And editing in the text field in the pop-up getInteger
    dialog works too. All these cases use QGraphicsViewAdapter
    under the hood, so why do some work and others don't?

a) osgQtBrowser --useWidgetImage [--fullscreen] (optional)
b) Try to click in the QTextEdit and type, or to select text

and drag-and-drop it somewhere else in the QTextEdit. These
don't work.

c) osgQtBrowser --useWidgetImage --sanityCheck
d) Try the operations in b), they all work.
e) osgQtBrowser --useWidgetImage --useBrowser [--fullscreen]
f) Try to click in the search field and type, it doesn't work.
g) osgQtBrowser
h) Try the operation in f), it works.

  1. Operations on floating windows (--numFloatingWindows 1 or more).
    Moving by dragging the titlebar, clicking the close button,
    resizing them, none of these work. I wonder if it's because the
    OS manages those functions (they're functions of the window
    decorations) so we need to do something special for that? But
    in --sanityCheck mode they work.

a) osgQtBrowser --useWidgetImage --numFloatingWindows 1


b) Try to drag the floating window, click the close button, or

drag its sides to resize it. None of these work.

c) osgQtBrowser --useWidgetImage --numFloatingWindows 1


d) Try the operations in b), all they work.
e) osgQtBrowser --useWidgetImage [--fullscreen]
f) Click the button so that the getInteger() dialog is

displayed, then try to move that dialog or close it with the
close button, these don't work.

g) osgQtBrowser --useWidgetImage --sanityCheck
h) Try the operation in f), it works.

  1. (Minor) The QGraphicsView's scrollbars don't appear when
    using QWidgetImage or QWebViewImage. QGraphicsView is a
    QAbstractScrollArea and it should display scrollbars as soon as
    the scene is too large to fit the view.

a) osgQtBrowser --useWidgetImage --fullscreen
b) Resize the OSG window so it's smaller than the QTextEdit.

Scrollbars should appear but don't.

c) osgQtBrowser --useWidgetImage --sanityCheck
d) Try the operation in b), scrollbars appear. Even if you have

floating windows (by clicking the button or by adding
--numFloatingWindows 1) and move them outside the view,
scrollbars appear too. You can't test that case in OSG for
now because of problem 2 above, but that's pretty cool.

  1. (Minor) In sanity check mode, the widget added to the
    QGraphicsView is centered. With QGraphicsViewAdapter, it is not.

a) osgQtBrowser --useWidgetImage [--fullscreen]
b) The QTextEdit and button are not in the center of the image

generated by the QGraphicsViewAdapter.

c) osgQtBrowser --useWidgetImage --sanityCheck
d) The QTextEdit and button are in the center of the


As you can see I've put specific repro steps there too, so it's clear
what I mean by a given problem. The --sanityCheck mode is useful to see
what should happen in a "normal" Qt app that demonstrates the same
situation, so hopefully we can get to a point where it behaves the same
with --sanityCheck and without."

2 added