使用Pyside,但一般的Qt问题:
我正在使用控制QMainWindow构建一个Qt应用程序。在这个窗口中,用户可以打开其他QMainWindows(或QDialogs),其中一些可以打开更多。用户打算将第一个QMainWindow视为“应用程序”,将其他视图视为对或多或少相同数据的许多不同视图。
所以我希望所有的窗口都可以独立堆叠,这样用户就可以根据自己的要求设置屏幕了。特别是我希望用户能够将第一个QMainWindow带到最顶层。但我真的不希望每个窗口都有自己的任务栏条目(虽然我可以忍受)。此外,我希望他们最小化和恢复,我希望他们都能在第一个主窗口关闭时关闭。
如果我将它们全部放在第一个主窗口上,它可以很好地工作,除非它们保持在它之上,这不是我想要的。
相反,我通过使它们全部独立于parent = None来实现它。然后我将它们全部注册到主窗口,并在关闭时将它们全部关闭。但这使得它们有点过于独立 - 它们分别最小化并且有自己的任务栏条目。
我错过了一些明显的解决方法吗?是否有任何简单的方法(一面旗帜?)来阻止孩子们留在父母之上?
或者是否存在一些我希望通过这种方式打破的UI指南?
或者是否有更清洁的设计?我想添加一个虚拟的父母,他们可以全部下降,但也许这是混乱的。那个父母需要视觉存在吗?我不希望这样。
建议?
答案 0 :(得分:1)
您可以拥有任意数量的QMainWindows或无父QWidgets。我认为处理你的情况的最好方法是创建你自己的伪父子关系,如下所示:
在QMainWindow子类中,存储您希望它管理的所有QWidgets的QList。然后,再次在您的QMainWindow子类中,重新实现方法,例如QWidget::closeEvent()
,QWidget::hideEvent()
(用于窗口最小化时)和QWidget::showEvent()
(用于恢复时),以便它也关闭,隐藏或显示其QList中的所有小部件。确保在QMainWindow子类的析构函数中也delete
。现在,每当你创建一个子窗口时,向主窗口传递一个指向它的指针不是普通的QWidget子,只是为了可以将它添加到QWidgets的主窗口QList中进行管理。 E.g:
MainWindowSubclass::addPseudoChild(QWidget *pseudoChild)
{
myListOfPseudoChildren.append(pseudoChild);
}
另一个尚未提及的替代方案是使用QMdiArea填充QMdiSubWindows。它并没有完全符合您的要求,但它仍然是一个非常干净的设计。
答案 1 :(得分:0)
所以我想我会加上我最终解决的问题。这特别受@leemes的评论(感谢 - 好东西)以及我自己的一些实验的启发。
我使用了此处附带的代码DetachTabExample 开发“可拆卸标签”小部件和标签栏。这允许在主窗口成为独立窗口时将标签拖动到主窗口之外。然后,如果关闭,他们将返回标签栏。
然后我将所有内容都放在QMainWindow
中,但是放在单独的标签中。用户可以将他们想要的那些拖到另一个监视器上。似乎工作正常。还有一些额外的窗户,我已经浮动,但它减少了杂乱,澄清了结构。