如何在Qt Designer中管理QSplitter

56

当我按下一个按钮时,会弹出一个对话框,用户可以选择东西并在最后按下“确定”。我想在这个对话框中加入一个分割器。左侧窗格将显示树形结构,右侧窗格将显示其他内容。我应该如何正确实现这个功能?

从Qt示例本身:

 QSplitter *splitter = new QSplitter(parent);
 QListView *listview = new QListView;
 QTreeView *treeview = new QTreeView;
 QTextEdit *textedit = new QTextEdit;
 splitter->addWidget(listview);
 splitter->addWidget(treeview);
 splitter->addWidget(textedit);

因此,在这个例子中,splitter是没有使用任何对话框资源创建的。如果我必须按照这种方式创建,那意味着我也必须在代码中创建所有的控件,而不是使用Qt Creator。

当我需要屏幕上的其他控件时,正确的做法是什么?

3个回答

120
您可以在Qt Designer中简单创建包含项目的分隔符:
  1. 首先,在设计师中将您的小部件放置在对话框或小部件上(它们不应该在布局中)

  2. 选择要放在分隔器中的小部件(通过按住CTL并单击它们)

  3. 右键单击所选小部件,从布局菜单中选择水平排列垂直排列中的分隔器

  4. 现在将网格布局应用于对话框,一切都应该没问题。您会在对象检查器视图中看到类似以下内容的内容:

进入图像描述


1
谢谢,这个方法很好用,但我的分割线在树和小部件之间。树占据了近80%的宽度。我没有看到树视图/小部件属性中可能导致此问题的任何内容,有什么建议吗?我希望树占30%,70%留给小部件。 - zar
2
请查看此帖子:https://dev59.com/gV8f5IYBdhLWcg3wFfP_#25063164 - Nejat
2
我无法使其工作,因为“在分割器中垂直布局”始终处于禁用状态。我有一个带有centralWidget的窗口,设置为垂直布局。在此之下,我有两个布局;这是我想要放在分割器下面的两件事。我怀疑你的评论“它们不应该在布局中”是相关的——centralWidget的布局可能导致菜单项变暗(?)。但如果是这样:我如何让centralWidget忘记我告诉它使用垂直布局?我找不到任何去除该设置的方法。我真的不想从头开始重新制作窗口! - bhaller
@bhaller 我也遇到了同样的问题,你是怎么解决的? - Troyseph
1
@Troyseph 在我的应用程序中,我最终通过代码创建了拆分视图并将其插入小部件层次结构中。 您可以在 https://github.com/MesserLab/SLiM 中看到我的代码。 运行得很好。 - bhaller
显示剩余4条评论

11

好的,我知道这很古老,但这是完整的答案。

首先,在某种小部件容器中放置您的内容。对于我刚刚完成的窗口,我的窗口是一个小部件。我在其中放置了两个标记为topContainerbottomContainer的小部件。然后,我将它们各自需要的所有小部件放入其中,并为它们分别设置了布局。

然后不要选择主容器。选择您想要拆分的两个小部件。实际上是在它们上面放置了一个分隔符,而不是在主容器上。所以我去了小部件列表窗口,一起选中这两个小部件,然后右键单击以打开对话框窗口,在“布局”选项中滚动并且“竖直分割布局”没有变灰。 选择它。

仍然需要在主容器上使用布局。拆分器不是布局。因此,在那时,我只需在主容器上放置一个垂直布局。

重申一遍:您不是在设置包含您要拆分的片段的容器的布局。您正在选择要拆分的两个小部件,并在它们周围添加QSplitter。这就是使其正常工作的诀窍。


2
您仍然可以使用Qt Designer(集成在Qt Creator中)在.ui文件中创建控件。在Qt Designer中,将一个QWidget对象添加到您的对话框中。然后,在您编写的QDialog派生类中,直接在构造函数中使用QWidget对象作为父级创建您的QSplitter。
这样,您可以从Qt Designer创建除分隔器对象以外的所有内容。
我认为也可以直接从Qt Designer创建QSplitter(就像可以创建QButtonQCheckBox等一样)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接