Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-72668

QMainWindow that contains a QOpenGLWidget will render blank even after closing the QDialog

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P2: Important
    • None
    • 5.12.0
    • GUI: OpenGL
    • None
    • macOS Mojave version 10.14
    • macOS

    Description

      I am having an issue where the QOpenGLWidget does not appear to work properly unless I manually resize the widget. I noticed if my QMainApplicationWindow uses other widgets beside a QOpenGLWidget it works fine. In the code sample below, it demonstrates what our application does where:

      • We create the QApplication
      • Display a simple modal dialog
      • After the user clicks Accept, we show a QMainWindow containing the QOpenGLWidget
      • Observe the QMainApplicationWindow appears blank unless you resize it.

       

      int main(int argc, char *argv[])
      {
      	QApplication app(argc, argv);
      	app.setOrganizationName("SecretLevel");
      	app.setOrganizationDomain("secret.com");
      	app.setApplicationName(APP_NAME);
      	app.setApplicationVersion(APP_VERSION);
      
      	QDialog *dlg = new QDialog(nullptr, Qt::Dialog);
      
      	QGridLayout *grid = new QGridLayout();
      	dlg->setLayout(grid);
      
      	//--- Ok/Cancel buttons ---
      	QHBoxLayout *pwLayout = new QHBoxLayout();
      	QPushButton *okBtn = new QPushButton("Login");
      	dlg->connect(okBtn, SIGNAL(clicked()),
      			dlg, SLOT(accept()));
      
      	QPushButton *cancelBtn = new QPushButton("Cancel");
      	dlg->connect(cancelBtn, SIGNAL(clicked()),
      			dlg, SLOT(reject()));
      	grid->addWidget(okBtn);
      	grid->addWidget(cancelBtn);
      	dlg->setAttribute(Qt::WA_DeleteOnClose);
      	if(dlg->exec() == QDialog::Accepted) {
      		QMainWindow *testWindow = new QMainWindow();
      		testWindow->resize(600, 500);
      		testWindow->show();
      		app.exec();
      	}
       }

      Workaround: Install a QTimer on the parent QMainWindow that's set to a certain interval. After the window is exposed and after the child QOpenGLWidget isValid() returns true, resize the widget to a different size (note: it cannot be the same size, nor does repaint(), update(), or update(0, 0, width, height) work)

      	QWindow *window = windowHandle();
      	if(window && window->isExposed() && _glWidget->isValid()) {
      		resize(801,601);
      		_timer.stop();
      	}
      

      Attachments

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

        Activity

          People

            lagocs Laszlo Agocs
            sandboxgod Richard
            Votes:
            3 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes