Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Promote QWidget to QMainWindow or add QMainWindow to QWidget from Qt Designer

My problem:

I want to customize the way the title bar works and looks for my application.

My idea:

I created a new QWidget form in Qt Designer and added a QWidget to it. I added the following code in constructor:

setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::FramelessWindowHint);

QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(20);
effect->setXOffset(0);
effect->setYOffset(0);
setGraphicsEffect(effect);

which makes the outer widget transparent and adds shadow to my inner widget. From this on I can create a custom title bar widget which I can implement however I want.

This is the result:

enter image description here

My issue

I want to make this usable from the designer as a main window and the QWidget doesn't allow me to add FROM THE DESIGNER tool bars, menu bar and status bar.

What I thought about was adding a QMainWindow widget as a child widget for the outer QWidget(which is transparent and acts as support for my shadow(the shadow is drawn on it)). I did this successfully but only from code:

QMainWindow *centralwidget = new QMainWindow();
centralwidget->setStyleSheet("background-color: lightgray;");
centralwidget->setGeometry(0, 0, 50, 20);
centralwidget->setWindowFlags(Qt::Widget);
this->layout()->addWidget(centralwidget);

QMenuBar *menuBar = new QMenuBar(centralwidget);
menuBar->addAction("Action");

QStatusBar *statusBar = new QStatusBar;
statusBar->showMessage("Status bar here");

centralwidget->addToolBar("tool bar");
centralwidget->setMenuBar(menuBar);
centralwidget->setStatusBar(statusBar);

This is the result:

enter image description here

My question:

How can I achieve this result from Qt Designer? Is it possible to promote a QWidget to QMainWindow? I cannot think to another way of doing it... It is really important for me to make it usable from Qt Designer because I intend to make it a template widget and be able to create e.g. a new QCustomMainWindow form Qt Creator just like you can create a QWidget or a QMainWindow.

Please help!

like image 757
Jacob Krieg Avatar asked Oct 21 '22 02:10

Jacob Krieg


1 Answers

Here is another SO question similar to yours: Qt4: Placing QMainWindow instance inside other QWidget/QMainWindow

Just adding on to my original comment:

Start with a QMainWindow, and then apply the appropriate flags to it. QMainWindow is a subclass of QWidget. If it can't be done easily in the designer, it is pretty painless to do in code. Do it in your constructor right after the ui->setup() call.

Start with QMainWindow

Project Selection Dialog

Form Selection Dialog

Customize Window Flags

So in the constructor in mainwindow.cpp, you put

http://qt-project.org/doc/qt-5/qt.html#WindowType-enum

this->setWindowFlags(Qt::Widget);

This is the default type for QWidget. Widgets of this type are child widgets if they have a parent, and independent windows if they have no parent. See also Qt::Window and Qt::SubWindow.

// or if you want to apply more than one you, "or" it together, like so:
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Tool);

Try out a couple of those and see what you like.

Customize Widget Attributes

There are also Widget Attributes, that give you strong control over how your widgets look like and behave.

http://qt-project.org/doc/qt-5/qt.html#WidgetAttribute-enum

Qt Style Sheets

In addition to all the flags and attributes above, you can also modify a ton of it with stylesheets:

http://qt-project.org/doc/qt-5/stylesheet-reference.html

this->setStyleSheet("background: #000000;");

Qt Designer Custom Widgets

And also if you are interested in making this a reusable thing in Qt Designer, you can make it into a Qt Designer plugin, or custom widgets.

http://qt-project.org/doc/qt-4.8/designer-using-custom-widgets.html

http://qt-project.org/doc/qt-4.8/designer-creating-custom-widgets.html

QMdiArea and QMdiWindow

Another path to look into besides using QMainWindow is QMdiSubWindow

http://qt-project.org/doc/qt-5/QMdiSubWindow.html

like image 130
phyatt Avatar answered Oct 22 '22 16:10

phyatt