[Qt-interest] custom OpenGL widget update blocks other Qt GUI rendering

Christopher Lux christopherlux at gmail.com
Mon Oct 4 14:00:05 CEST 2010


Hi,
i have a custom OpenGL widget which basically looks like the code
snippet on the bottom of the mail.

I use this->update() to force a redraw. If i understand the
documentation correctly update() just inserts a update event in the
event queue, so all other events of the application should not be
influenced. For example when i open a modal QFileDialog, the update
should be postponed until the dialog returns. But since Qt 4.6.x i can
see the OpenGL content being updated even of the QFileDialog is open
and the rest of the GUI becomes really unresponsive (under Windows,
under X11 the QFileDialog does not even render correctly).

I do not want to transfer the OpenGL rendering into another thread. Is
there any way to get the old blocking behavior back?

Regards
-chris

class viewer_widget : public QWidget
{
    Q_OBJECT

public:
    viewer_widget(QWidget* parent = 0, [custom context initializer])
  : QWidget(parent, Qt::MSWindowsOwnDC)
    {
    setMouseTracking(true);
    setFocusPolicy(Qt::StrongFocus);

    setAttribute(Qt::WA_NativeWindow, true);
    setAttribute(Qt::WA_PaintOnScreen, true); // disables qt double
buffering (seems X11 only since qt4.5, ...)
    setAttribute(Qt::WA_NoSystemBackground, true);
    setAutoFillBackground(false);

    [initialization of my own context etc]

    }
    virtual ~viewer_widget();

    QPaintEngine*               paintEngine() const { return 0; }

protected:
    void                        paintEvent(QPaintEvent* paint_event)
    {
        paint_event->accept();

        [render the scene etc.]

        this->update();
    }
    void                        resizeEvent(QResizeEvent* resize_event)
    {
        [update size etc.]
    }



More information about the Qt-interest-old mailing list