【发布时间】:2017-08-14 21:14:28
【问题描述】:
Qt 有一种与小部件分离的布局系统,这给我带来了问题。我知道当我有一个 QSplitter 时,我可以通过这样做来添加东西
new SomeCustomQWidget(splitter);
但是,如果我有一个 QWidget,我不应该能够做类似的事情吗? Qt 网页仅说明如何将 layoutItems 添加到布局中,仅通过在子类中继承两者来将它们连接到小部件。所以,对,不,我正在做这样的事情
item = new QWidget(parentsplitter); //this works
subitem = new customWidget(item); //this too
subitem2 = new QSlider(item); //this isn't laid out with subitem
但是,这会导致滑块位于子项的顶部,而不是在它旁边(我希望在右侧或下方)。调用
//either
new QVBoxLayout(item);
//or
item->setLayout(new QVBoxLayout());
//or
item->setLayout(new QVBoxLayout(item));
在初始化项目后没有帮助。 (我的逻辑是该项目将布局作为其子项,并将向其添加后续子项)。
我早些时候解决了这个问题,但现在在 QGraphicsView 中制作小部件时遇到了完全相同的问题。我觉得没有必要为我想要动态添加到这些小部件的每个项目创建一个自定义子类,就像 Qt 网站似乎期望的那样。 (如果我只是想添加一些文本和几个按钮,我真的需要创建 2 个自定义子类吗?)我使用 .ui 文件进行基本布局,但这些项目需要动态创建。
解决方案
忘记在用于布局的小部件上调用item->show();。
事实证明,我测试了其他正确的代码,但是由于我的一些子类调用了 show() 而其他的没有,所以它对我来说似乎是坏的。
但这不是图形小部件的问题,因为图形布局只能用于添加图形布局项,例如不包括图形文本项。
解决方案 2 使用 QGraphicsProxyWidget 而不是 QGraphicsWidget 解决了这个问题!
【问题讨论】: