We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you two Citrix podcasts. Learn about 2020 trends and get answers to your biggest Citrix questions!Listen Now

x

qt opengl QGLWidget inside QMainWindow

DaFou
DaFou asked
on
Medium Priority
3,486 Views
Last Modified: 2013-11-23
Hi, im doing some qt opengl programming in windows.

I need a window split in 2 pieces (right one must be an opengl window), with a top menu (file edit view favorites tools help thingy). In order to make the top menu there is a class that is derived from QMainWindow.

Question: How do I get a qt window that is split into 2 sections, with a top menu?

code I left off, its the opengl window that isn't willing to appear on screen:

MainWindow::MainWindow(QWidget *parent ,const char *name ) : QMainWindow(parent, name)
{
      createActions();
      createMenus();
      createToolbars();
      // no status bar


      
      // some frames
      QFrame* f1 = new QFrame( this, "frame1" );
      QFrame* f2 = new QFrame( this, "frame2" );
      QFrame* f3 = new QFrame( this, "frame3" );

    // Widget creation
      //createProgressBar();
      //createGLWidget();
      
      glWidget = new CGLWidget(f1, "glWidget");

      //createPanel();
      //QVBoxLayout *leftLayout = new QVBoxLayout;
      //QVBoxLayout *bottomRightLayout = new QVBoxLayout;
      //bottomRightLayout->addWidget(timeProgressBar);
      //      QVBoxLayout *rightLayout = new QVBoxLayout;
      //      rightLayout->addWidget(glWidget);
      //      rightLayout->addLayout(bottomRightLayout);
      QHBoxLayout *mainLayout = new QHBoxLayout(f1, 2, 2, "flayout1");
      mainLayout->addWidget(glWidget);

      
   

    //QHBoxLayout* flayout1 = new QHBoxLayout( f1, 2, 2, "flayout1");
    //flayout1->addWidget( GLView );
}

thanks in advance.
Comment
Watch Question

You mean you want two top level windows ?
If you want the GL window to be top level then
Do something like this

QFrame* f1 = new QFrame( 0, "frame1" ); // 0 removed with this
...
glWidget = new CGLWidget(f1, "glWidget");
...

Author

Commented:
No, i want to see a window derived from the QMainWindow class, splitted horizontal in two pieces and with the right one viewing opengl.

some header code for clarification:
#include <stdio.h> // printf
#include <qapplication.h>
#include "mainwindow.h"

int main(int argc, char* argv[])
{
      QApplication app(argc, argv);
      if(!QGLFormat::hasOpenGL())
            qFatal("This system has no OpenGL support.");
      MainWindow theWindow;
      app.setMainWidget(&theWindow);
      theWindow.show();
      return app.exec();
}



#if !defined(AFX_GLWIDGET_H__EED2A780_631B_438F_9B09_3F0E27084BBF__INCLUDED_)
#define AFX_GLWIDGET_H__EED2A780_631B_438F_9B09_3F0E27084BBF__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include <qgl.h>

#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>

class CGLWidget : public QGLWidget  
{
public:
      CGLWidget(QWidget *parent = 0, const char * name = 0);
      virtual ~CGLWidget();

protected:
      void draw();
      void resizeGL(int width, int height);
      void initializeGL();
      void paintGL();
};

#endif // !defined(AFX_GLWIDGET_H__EED2A780_631B_438F_9B09_3F0E27084BBF__INCLUDED_)


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "glwidget.h"

#include <qmainwindow.h>#include <qlabel.h>#bla blayout.h>

class MainWindow : public QMainWindow  
{

      Q_OBJECT
public:
      MainWindow(QWidget *parent = 0,const char *name = 0);
      virtual ~MainWindow();

private:
      bool modified;
      bool maybeSave();
      protected:
            void closeEvent(QCloseEvent *event);
            void contextMenuEvent(QContextMenuEvent *event);
      private slots:
            void newFile();
            void open();
            bool save();
            //bool saveAs();
            void about();
      private:
            void createProgressBar();
      // actions
      void createActions();
      QAction *newAct;
      QAction *openAct;
      //
      QAction *aboutAct;
      
      // menus
      void createMenus();
      QPopupMenu *fileMenu;
      QPopupMenu *editMenu;
      QPopupMenu *toolsMenu;
      QPopupMenu *aboutMenu;
            
      // progress bar
      QProgressBar *timeProgressBar;

      // timer
            int myTimerId;
      protected:
      void timerEvent(QTimerEvent *event);
      // toolbars
      void createToolbars();
      QToolBar *fileToolBar;
      QToolBar *editToolBar;
      QToolBar *toolsToolBar;
      QToolBar *helpToolBar;

      // save dialog
      void MaybeSave();

      // widgets
      CGLWidget *glWidget;
};

#endif // !defined(AFX_MAINWINDOW_H__F0827899_A2E2_4FE1_8E41_F9E0333F3B2F__INCLUDED_)
Hi DaFou
I got the thing.
Are you using Qt4 or Qt3 ? From your code it seemd you are using Qt3.

You need to use two QDockWidget that will split your main window into two regions.
In Qt3 may be it is called QDockWindow. Just check this out.

Please mail again if you fase any problem.

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts

Author

Commented:
QDockWindow works also but I have chosen to use the splitter. Thank you for your information on the domain of Qt3 I have used it to work out all posibilities.


// splitter
      horSplitter = new QSplitter(Horizontal, this);
      setCentralWidget(horSplitter);
      
// widgets
      leftWidget = new CLeftWidget(horSplitter);
      glWidget = new CGLWidget(horSplitter);

DaFou
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.