我很久以来一直在使用PyQt,我知道如果我们在PyQt中使用QGridLayout ,我们可以在特定网格中指定特定的小部件。
例如
grid = QtGui.QGridLayout()
grid.setSpacing(10)
grid.addWidget(self.Banner,0,0,1,4,QtCore.Qt.AlignTop | QtCore.Qt.AlignCenter)
grid.addWidget(self.RefNo,1,0,1,2)
grid.addWidget(self.RefNoText,1,2,1,2)
其中self.banner
,self.Refno
和self.RefNoText
是一些小部件。在这种情况下,我们可以指定小部件,然后行号。对于它和列号。为了它。在Kivy有可能这样做吗?
我在Kivy尝试过但似乎在Kivy中我们必须在开始时指定行和列,然后在添加小部件时它们是自己安排的吗?
有什么想法吗?
答案 0 :(得分:3)
在Kivy中,当我们向GridLayout添加小部件时,我们只需指定行,列或两者。
然后我们将定位留给Kivy,根据我们的规格自动填充它。
查看Official Documentation for GridLayout
有一个非常好的.gif文件解释了如何在GridLayout中安排小部件。
所以,你的问题的答案是否定的。我们无法指定放置窗口小部件的位置,但是,我们所能做的就是将窗口小部件添加到GridLayout中,使其正确定位。
最初,我发现制作小部件比一次小区占用更多空间有困难,如下所示:
<2 cells><1cell>
+--------+-----+
|Big | |
|Widget | |
+--------+-----+
| | | |
| | | |
+---+----+-----+
然而,这可以解决使整个行成为BoxLayout。像这样:
<1 big BoxLayout>
+--------+-----+
|Big | |
|Widget | |
+--------+-----+
| | | |
| | | |
+---+----+-----+
<1 more BoxLayout>
这样,每个BoxLayout只占用一个单元格。可以使用BoxLayout自定义窗口小部件的间距,然后将其放置在网格中。
以下是如何在Kv中做到这一点:
<MyGrid>
cols=1 # Actually, you can just use a vertical box
BoxLayout:
BigWidget:
# Properties
SmallWidget:
# Properties
BoxLayout:
SmallWidget:
# Properties
SmallWidget:
# Properties
SmallWidget:
# Properties
Kivy会自动用1列填充网格
因此,通过嵌套布局,您可以获得所需的输出。
答案 1 :(得分:2)
Kivy的GridLayout与PyQt完全不同,并不适合这个特定用途。
一种自然的替代方法是使用FloatLayout,通过pos_hint
和size_hint
放置小部件。您甚至可以创建一个FloatLayout子类来自动处理网格中的定位。
碰巧,我之前创建了这个,你可以找到我的代码here。我的SparseGridLayout使用子窗口小部件的col
和row
属性来适当地定位它。如果您愿意,也可以覆盖add_widget
以精确复制qt语法,但重要的是要了解我是如何使用FloatLayout放置小部件的。