// qt includes #include #include #include #include #include #include class MyMainWindow : public QMainWindow { public: MyMainWindow(QWidget* parent = nullptr) : QMainWindow(parent) { // setup main window setCentralWidget(new QWidget(this)); // toolbar 1 setup toolbar1 = new QToolBar("Toolbar 1"); toolbar1->setObjectName("Toolbar 1"); addToolBar(Qt::TopToolBarArea, toolbar1); toolbar1->addAction("Toolbar 1", []() {}); // toolbar 2 toolbar2 = new QToolBar("Toolbar 2"); toolbar2->setObjectName("Toolbar 2"); addToolBar(Qt::TopToolBarArea, toolbar2); toolbar2->addAction("Toolbar 2", []() {}); // dock examples dock1 = new QDockWidget("Dock 1", this); dock1->setObjectName("Dock 1"); addDockWidget(Qt::LeftDockWidgetArea, dock1); dock2 = new QDockWidget("Dock 2", this); dock2->setObjectName("Dock 2"); addDockWidget(Qt::LeftDockWidgetArea, dock2); // *** CRUX OF ISSUES *** // // setup toolbar 1 calls toolbar1->addAction("View 1", [this]() { // attempt 1 - PREFERRED - use remove? Issue 1. requires custom restore (why no restoreToolBar?) ////QSettings settings; ////settings.setValue(toolbar2->objectName(), toolbar2->saveGeometry()); //removeToolBar(toolbar2); // attempt 2 - setHidden? Issue 1. displays anyways if it was user-set to hidden; Issue 2. bad context menu entry toolbar2->setHidden(true); // attempt 3 - use QSettings? Issue 1. misses state - need more custom QSettings; Issue 2. bad context menu entry //QSettings settings; //settings.setValue(toolbar2->objectName(), toolbar2->saveGeometry()); //toolbar2->setHidden(true); // attempt 4 - custom use of QSettings? Main Issue: lots to save and "get right", including area, relative location in area, geometry, etc. //QSettings settings; //settings.setValue(toolbar2->objectName() + "_floating", toolbar2->isFloating()); //settings.setValue(toolbar2->objectName() + "_geometry", toolbar2->geometry()); //settings.setValue(toolbar2->objectName() + "_visible", toolbar2->isVisible()); //settings.setValue(toolbar2->objectName() + "_toolbararea", (unsigned)this->toolBarArea(toolbar2)); //removeToolBar(toolbar2); // easy dock example - works fine! removeDockWidget(dock2); statusBar()->showMessage("View 1"); }); QAction* defaultView = toolbar1->addAction("View 2", [this]() { // attempt 1 - PREFERRED - use remove? Issue 1. requires custom restore (why no restoreToolBar?) ////QSettings settings; ////toolbar2->restoreGeometry(settings.value(toolbar2->objectName()).toByteArray()); //addToolBar(toolbar2); // ? insertToolBar? need to save/restore: floating position and/or toolbar placement (top/left, etc.; after which toolbar(s); below which toolbar(s)) //toolbar2->show(); // has bad placement // attempt 2 - setHidden? 1. displays anyways if it was user-set to hidden; 2. bad context menu entry toolbar2->setHidden(false); // attempt 3 - use QSettings? Issue 1. misses state - need more custom QSettings; Issue 2. bad context menu entry //QSettings settings; //toolbar2->restoreGeometry(settings.value(toolbar2->objectName()).toByteArray()); //toolbar2->setHidden(false); // attempt 4 - custom use of QSettings? Main Issue: lots to save and "get right", including area, relative location in area, geometry, etc. //QSettings settings; //Qt::ToolBarArea area = ( Qt::ToolBarArea )settings.value(toolbar2->objectName() + "_toolbararea").toUInt(); //addToolBar(area, toolbar2); // not right - may re-order toolbars //toolbar2->setVisible(settings.value(toolbar2->objectName() + "_visible").toBool()); //bool isFloating = settings.value(toolbar2->objectName() + "_floating").toBool(); //if ( isFloating ) // toolbar2->setWindowFlags(toolbar2->windowFlags() | Qt::FramelessWindowHint); //toolbar2->setGeometry(settings.value(toolbar2->objectName() + "_geometry").toRect()); // easy dock example - works fine! restoreDockWidget(dock2); statusBar()->showMessage("View 2"); }); // *** END CRUX OF ISSUES *** // QAction* quitAction = toolbar1->addAction("Quit", [this]() { this->close(); }); quitAction->setShortcut(Qt::Key_Q); resize(1200, 800); // its all setup - restore prior state LoadUI(); // load default view defaultView->trigger(); } void LoadUI() { // load settings from registry QSettings settings; QString sQState = "windowState"; bool hasSettings = settings.contains(sQState); if ( hasSettings ) restoreState(settings.value(sQState).toByteArray()); QString sQGeometry = "windowGeometry"; hasSettings = settings.contains(sQGeometry); if ( hasSettings ) restoreGeometry(settings.value(sQGeometry).toByteArray()); } void closeEvent(QCloseEvent* event) { QSettings settings; QString sQState = "windowState"; settings.setValue(sQState, saveState()); QString sQGeometry = "windowGeometry"; settings.setValue(sQGeometry, saveGeometry()); } private: QToolBar *toolbar1, *toolbar2; QDockWidget *dock1, *dock2; }; int main( int argc, char *argv[] ) { // setup application QApplication app( argc, argv ); app.setOrganizationName("QtExample"); app.setApplicationName("ToolBarSettingsBug"); // setup main window MyMainWindow mainWin; mainWin.show(); return app.exec(); }