Родительские отношения Qt для независимых qmainwindows

Используя Pyside, но общий вопрос Qt:

Я создаю приложение Qt с управляющим QMainWindow. Из этого окна пользователь может открыть другие QMainWindows (или QDialogs) и от некоторых из них, которые она может открыть больше. Пользователь должен думать о первом QMainWindow как о "приложении", а остальные - о множестве разных представлений по более или менее одинаковым данным.

Поэтому я бы хотел, чтобы все окна были независимыми друг от друга, поэтому пользователь может настроить экран на свои собственные требования. В частности, я хочу, чтобы пользователь мог принести первый QMainWindow сверху, если захотите. Но я не хочу, чтобы у каждого окна была своя запись панели задач (хотя я могу жить с этим). Также я хотел бы, чтобы они минимизировали и восстанавливали вместе, и я хотел бы, чтобы все они закрылись, когда закрылось первое главное окно.

Если я родила их всех на первом главном рабочем столе, это прекрасно работает, за исключением того, что они остаются на вершине, что не то, что я хочу.

Вместо этого у меня есть такая работа, сделав их независимыми с parent = None. Затем я регистрирую их все в главном окне и закрываю их все, когда он закрывается. Но это делает их немного независимыми - они сводят к минимуму раздельно и имеют собственную запись в панели задач.

Неужели я пропустил какое-то очевидное решение? Есть ли какой-либо простой способ (флаг?), Чтобы дети оставались на родине?

Или есть ли какое-то руководство по пользовательскому интерфейсу, которое я нарушаю, желая этого?

Или есть какой-то более чистый дизайн? Я подумал о добавлении фиктивного родителя, из которого они могли бы все спуститься, но, может быть, это беспорядочно. Будет ли этот родитель нуждаться в визуальном присутствии? Я бы этого не хотел.

Предложения?

+1
20 мая '12 в 9:33
источник поделиться
2 ответа

Поэтому я подумал, что добавлю, что я в конце концов обосновал. Это было особенно вдохновлено комментариями @leemes (Спасибо - хорошие вещи) и немного экспериментирования.

Я использовал прилагаемый здесь код DetachTabExample для разработки виджета "Съемная вкладка" и панели вкладок. Это позволяет перетаскивать вкладки вне основного окна, когда они становятся независимыми окнами. Затем, если они закрыты, они возвращаются к панели вкладок.

Затем я разместил весь свой контент в QMainWindow но в отдельных вкладках. Пользователи могут перетаскивать те, которые они хотят, на другой монитор. Кажется, работает нормально. Есть еще некоторые дополнительные окна, которые я плаваю, но он сократил беспорядок и прояснил структуру.

0
03 июн. '13 в 22:08
источник

Вы можете иметь столько QMainWindows, сколько хотите, или без QWidgets. Я думаю, что лучший способ справиться с вашей ситуацией - создать свои собственные отношения псевдо-родитель-ребенок:

В подклассе QMainWindow сохраните QList всех QWidgets, которые вы хотите, чтобы он управлял. Затем снова в подклассе QMainWindow можно переопределить такие методы, как QWidget::closeEvent(), QWidget::hideEvent() (для минимизации окна) и QWidget::showEvent() (для восстановления), так что он также закрывает, скрывает или показывает все виджеты в QList. Обязательно delete их в деструкторе подкласса QMainWindow. Теперь, когда вы создаете вспомогательное окно, передайте главному окну указатель на него не как обычный QWidget-ребенок, а просто чтобы его можно было добавить в главное окно QList QWidgets для управления. Например:

MainWindowSubclass::addPseudoChild(QWidget *pseudoChild)
{
    myListOfPseudoChildren.append(pseudoChild);
}

Еще одна альтернатива, о которой еще не упоминалось, заключается в заполнении QMdiArea QMdiSubWindows. Это не делает то, что вы просили, но тем не менее это довольно чистый дизайн.

+1
20 мая '12 в 16:18
источник

Посмотрите другие вопросы по меткам или Задайте вопрос