我正在开发一些桌面软件,该软件需要一个静态窗口和一个充满动态内容的框架。框架在主窗口上,主窗口有一个网格布局,可以让我通过编辑器添加的小部件随着窗口大小的调整自动调整/扩展。
我创建了一个自定义小部件(并使用框架和可停靠小部件进行了一些更改),以尝试获得所需的行为。当我将这个小部件添加到一个新的布局中(我已经尝试了QVBoxLayout和QGridLayout)并告诉框架使用该布局时,没有小部件被显示,但是,如果我创建了小部件的框架变体并用构造函数中的框架作为其父级(又称新的CustomWidget(this->ui->my_frame);),它显示,但显然没有遵循布局(没有展开)。我的自定义窗口小部件的其他组合(如QWidget、QFrame或QDockableWidget)不会显示在我的框架中,如果它不可能显示,它不会随着窗口大小调整事件而扩展。
我在一些地方读到,覆盖主窗口的调整大小事件功能可能会解决这个问题,但这只是在我不使用布局的情况下——我更喜欢使用布局。
如果我使用固定内容和QTabWidget,我可以获得所需的输出,但我正在为其构建此应用程序的客户端非常希望我不要使用选项卡。他们的竞争对手的软件使用标签,我们都认为它看起来很笨重。
我想,我最终会编写小部件界面的代码,但现在我很好奇为什么将这些小部件导入到布局中不能按预期工作。
如果我正确理解您的描述,您有一个带有空白QFrame的主窗口,您希望在运行时使用它来动态添加其他QWidget。
将新的子QWidget添加到占位符QFrame时,如果希望自动放置和调整它们的大小,则必须将它们添加到占位符QFrame的QLayout,而不是主窗口。
我建议尝试从一个简单小部件的子类开始(例如带有一些文本的QLabel),并在代码中使用它来查看它是否有效。您可能需要添加代码来处理Qt期望小部件执行的操作,而现有小部件已经在处理这些操作。
根据过去的经验,你所描述的(添加到布局,将布局分配给框架)是有效的,也是正确的方法。所以我想一定有一些代码可以处理自定义窗口小部件中缺少的布局信号。
例如:
布局是一种优雅而灵活的方式,可以在容器中自动排列子窗口小部件。每个小部件通过sizeHint和sizePolicy属性向布局报告其大小要求,布局相应地分配可用空间。
来自:小部件和布局文档