#include class ToolBar : public QToolBar { Q_OBJECT public: using QToolBar::QToolBar; #ifdef Q_OS_LINUX protected: void showEvent(QShowEvent *e) override { QToolBar::showEvent(e); if (isFloating() && windowFlags().testFlag(Qt::X11BypassWindowManagerHint) ) { // QMainWindow::show() after QMainWindow::restoreState() will break the minimizing again so we should delay calling adjustToolbar(). QMetaObject::invokeMethod(this, "adjustToolbar", Qt::QueuedConnection); // If we're sure restoreState() is only called after show() then adjustToolbar() could be called here directly instead. //adjustToolbar(); } } private slots: void adjustToolbar() { const bool vis = !isHidden(); hide(); setWindowFlags(windowFlags() & ~Qt::X11BypassWindowManagerHint); if (vis) show(); } #endif }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { QComboBox* cb1 = new QComboBox(this); cb1->setEditable(true); QToolBar* goodTb = new ToolBar(this); goodTb->setObjectName("Toolbar_1"); goodTb->setWindowTitle("Good Toolbar"); goodTb->addWidget(cb1); goodTb->addAction("Good Bar"); QComboBox* cb2 = new QComboBox(this); cb2->setEditable(true); QToolBar* badTb = new QToolBar(this); badTb->setObjectName("Toolbar_2"); badTb->setWindowTitle("Bad Toolbar"); badTb->addWidget(cb2); badTb->addAction("Bad Bar"); addToolBar(Qt::TopToolBarArea, goodTb); addToolBar(Qt::BottomToolBarArea, badTb); // Floating dock widget restore issue test -- state must be restored after show() //QDockWidget *dw = new QDockWidget("Test Dock", this); //dw->setObjectName("DockWidget"); //dw->setWidget(new QLineEdit("Dock widget")); //addDockWidget(Qt::BottomDockWidgetArea, dw); // Adding central widget doesn't make any difference. //setCentralWidget(new QWidget(this)); //centralWidget()->setLayout(new QHBoxLayout()); //centralWidget()->layout()->addWidget(new QLineEdit("Test Editor", this)); show(); readSettings(); } void closeEvent(QCloseEvent *event) override { QSettings settings; settings.setValue("windowState", saveState()); settings.setValue("windowGeo", saveGeometry()); QMainWindow::closeEvent(event); } void readSettings() { QSettings settings; restoreGeometry(settings.value("windowGeo").toByteArray()); restoreState(settings.value("windowState").toByteArray()); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); QApplication::setOrganizationName("MyCompany"); QApplication::setApplicationName("MyApp"); QSettings::setDefaultFormat(QSettings::IniFormat); MainWindow w; return app.exec(); }