Сделать два QDockWidget взаимоисключающими в одной и той же позиции

У меня есть два QDockWidget, только один из них виден в данный момент, я управляю этим с помощью toggleViewAction().

Что мне нужно сделать, так это то, что я хочу, чтобы два QDockWidget находились в одном месте, имели одинаковый размер и были закреплены в одной и той же области док-виджета с той же ориентацией и порядком относительно других QDockWidget.

Я сделал большую часть этого кода:

void myMainWindow::slotToggleDocks(QAction* action) {
    if(action == viewDock1) {
    Dock1->setFloating(Dock2->isFloating());
    Dock1->resize(Dock2->size());
    Dock1->restoreGeometry(Dock2->saveGeometry());
    Dock1->move(Dock2->pos());
    addDockWidget(dockWidgetArea(Dock2), Dock1);
    ...
        Dock2->hide();

    } else if(action == viewDock2) {
    Dock2->setFloating(Dock1->isFloating());
    Dock2->resize(Dock1->size());
    Dock2->restoreGeometry(Dock1->saveGeometry());
    Dock2->move(Dock1->pos());
    addDockWidget(dockWidgetArea(Dock2), Dock1);
    ...
        Dock1->hide();
    }
}

этот код заставляет их иметь одинаковое местоположение и размер и пристыковывать к одной и той же области (слева, справа, ...), но это не гарантирует, что доки будут иметь одинаковую компоновку с другими QDockWidget в той же самойockWidgetArea.

Значение, если это был макет до:

http://holmez.net/qdockwidget/1.png

Это после переключения:

http://holmez.net/qdockwidget/2.png

Это то, что я хочу:

http://holmez.net/qdockwidget/3.png


person Mahmoud Hassan    schedule 17.09.2013    source источник
comment
Я хочу, чтобы это было: holmez.net/qdockwidget/3.png   -  person Mahmoud Hassan    schedule 17.09.2013
comment
Я вставил изображения для вас и добавил изображение из ваших комментариев. Однако это похоже на мертвую ссылку. Это должно работать, если вы загрузите 3.png на этот сервер.   -  person Tim Meyer    schedule 17.09.2013
comment
Исправил третье изображение. Спасибо, Тим.   -  person Mahmoud Hassan    schedule 17.09.2013


Ответы (3)


Мне удалось сделать это с помощью простого трюка, добавив эту строку кода:

splitDockWidget(Dock1,Dock2,Qt::Horizontal);

перед тем, как скрыть Dock1, и эту строку:

splitDockWidget(Dock2,Dock1,Qt::Horizontal);

прежде чем скрыть Dock2.

Это устранило проблему с расположением закрепленных виджетов, не уверен, что это лучший способ, но у меня он работает.

person Mahmoud Hassan    schedule 19.09.2013

Как насчет использования только двух QDockWidget, но с QStackedWidgets ВНУТРИ? которые вы можете использовать для обмена представлениями? Это то, чем я сейчас занимаюсь, и это прекрасно работает.

Еще одним преимуществом является то, что обмен представлениями так же прост, как:

    stackedWidget->setCurrentIndex(index);
person Taylor Brandstetter    schedule 17.09.2013
comment
Я пробовал, но QStackedWidget нельзя ни перетащить, ни закрепить, есть идеи? - person Mahmoud Hassan; 19.09.2013

Как насчет использования QTabWidget? 2 виджета должны быть в одном и том же Qt::DockWidgetAreas

person Sara Barlo    schedule 11.10.2013
comment
Я попробовал это, но проблема с QTabWidget связана с его вкладками, мне не нужны эти вкладки, и та же проблема с QStackedWidgets, обе они не перемещаются и не могут закрепляться. - person Mahmoud Hassan; 11.10.2013
comment
вы можете добавить QTabWidget внутрь QDockWidget, чтобы вы могли перемещать и закреплять его, и вы можете использовать пользовательский QTabBar для изменения внешнего вида вкладок. - person Sara Barlo; 11.10.2013