2

使用 Pyside,但一般 Qt 问题:

我正在构建一个带有控制 QMainWindow 的 Qt 应用程序。从这个窗口,用户可以打开其他 QMainWindows(或 QDialogs),并从其中一些她可以打开更多。用户打算将第一个 QMainWindow 视为“应用程序”,而将其他 QMainWindow 视为对或多或少相同数据的许多不同视图。

所以我希望所有的窗口都可以独立堆叠,这​​样用户就可以根据自己的要求设置屏幕。特别是,如果需要,我希望用户能够将第一个 QMainWindow 置于顶部。但是我真的不希望每个窗口都有自己的任务栏条目(尽管我可以忍受)。此外,我希望它们一起最小化和恢复,并且我希望它们在第一个主窗口关闭时全部关闭。

如果我将它们全部放在第一个主窗口上,它会很好地工作,只是它们留在上面,这不是我想要的。

相反,我通过使它们都独立于 parent = None 来使其工作。然后我将它们全部注册到主窗口并在它关闭时将它们全部关闭。但这使它们有点过于独立——它们分别最小化并有自己的任务栏条目。

我错过了一些明显的解决方法吗?有什么简单的方法(一面旗帜?)来阻止孩子们站在父母的头上吗?

或者是否有一些我想要打破的 UI 指南?

或者是否有更清洁的设计?我想添加一个他们都可以继承的虚拟父母,但也许这很混乱。那位父母需要视觉上的存在吗?我不想那样。

建议?

4

2 回答 2

1

您可以拥有任意数量的 QMainWindows,或无父 QWidget。我认为处理您的情况的最佳方法是创建自己的伪父子关系,如下所示:

在您的 QMainWindow 子类中,存储您希望它管理的所有 QWidget 的 QList。然后,再次在您的 QMainWindow 子类中,重新实现方法,例如QWidget::closeEvent()QWidget::hideEvent()(当窗口最小化时)和QWidget::showEvent()(当它恢复时),以便它也关闭、隐藏或显示其 QList 中的所有小部件。确保delete它们也在 QMainWindow 子类的析构函数中。现在,每当您创建子窗口时,将主窗口的指针传递给它,而不是作为普通的 QWidget child,而只是为了可以将其添加到主窗口的 QWidget 的 QList 中进行管理。例如:

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

尚未提及的另一种替代方法是使用QMdiSubWindows填充QMdiArea。它并没有完全按照你的要求做,但它仍然是一个非常干净的设计。

于 2012-05-20T16:18:58.190 回答
1

所以我想我会添加我最终确定的内容。这特别受到@leemes 的评论(谢谢 - 好东西)和我自己的一些实验的启发。

我使用此处附加的代码DetachTabExample 来开发“可拆卸标签”小部件和标签栏。这允许选项卡在成为独立窗口时被拖到主窗口之外。然后,如果关闭,它们将返回标签栏。

Then I placed all my content in the QMainWindow but in separate tabs. The users can drag the ones they want out on to the other monitor. Seems to be working fine. There are still some extra windows that I have floating but it has cut down the clutter and clarified the structure.

于 2013-06-03T22:08:57.857 回答