【问题标题】:Qt Parent child relationship for independent qmainwindowsQt 独立主窗口的父子关系
【发布时间】:2012-05-27 04:32:28
【问题描述】:

使用 Pyside,但一般 Qt 问题:

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

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

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

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

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

或者是否有一些 UI 准则是我想要这样做而违反的?

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

建议?

【问题讨论】:

  • 在单个 QMainWindow 中的选项卡不是更好的 UI 设计吗? (我只是想给你一个替代的想法。)
  • 谢谢 - 这就是我正在寻找的想法。但这不适合我,因为用户需要同时查看多个窗口:例如,他们获取不同缩放比例的地图以及要一起查看的表格......
  • 好的,这个折衷方案怎么样:主窗口内的选项卡+“在外部窗口中打开选项卡”的选项。这个窗口可以是一个没有菜单和状态栏的简单 QWidget。所以用户知道这是一个外部视图。不会有像“应用程序的主窗口又是什么?”这样的困惑。因为如果您的所有主窗口看起来都一样,但其中一个是真正的主窗口,那将是一个问题。 (同样,只是一个想法。)
  • 我可以试试。虽然如果 QWidget(我想我会使用 QDialog)坚持位于 MainWindow 之上,我仍然会遇到同样的问题。
  • 再想一想 - 这可能没问题。 QMainWindow 甚至可以有自己的内容作为选项卡。因此,一旦拖出,所有选项卡只需要位于空选项卡框架的顶部即可。我会试试看的。

标签: qt window parent-child


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,谢谢。这或多或少是我所做的,以为我没有连接隐藏和显示事件。实际上,我没有删除。一些窗口 WA_DeleteOnClose (并在它们关闭时将它们自己从它们的伪父级中删除)。其他的只是关闭(并且可能被重复使用),并且在整个应用程序关闭之前不要删除。我想我不需要删除那些。
  • 也感谢 MDI 的建议。但我认为这不适合这种情况。一个重要的用例是保持一个窗口打开,比如在单独的监视器上,然后在其他窗口上工作。我认为如果我在放置和调整窗口大小方面为用户提供最大的灵活性是最简单的。
【解决方案2】:

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

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

然后我将所有内容放在QMainWindow 中,但放在单独的选项卡中。用户可以将他们想要的那些拖到另一台显示器上。似乎工作正常。我还有一些额外的窗口浮动,但它减少了混乱并澄清了结构。

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 2011-05-26
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多