Fork me on GitHub

PyQt QGridLayout布局中的视图切换

PyQt QGridLayout布局中的视图切换

我们在主窗口中添加了一个QGridLayout 的 2x2的布局,当想让主窗口只显示其中的某一个布局该怎么办?

例如下图,最初默认是显示widget1 widget2 widget3 widget4 这四个窗口,但是我们想通过按键点击,然后切换到widget1或其中任意一个窗口

我们想到的方法是先删除 grid 里的所以控件,然后再添加新的控件,然后我们查到可以通过grid.count方法获得grid布局里的控件数量,

接着通过grid.itemAt(i).widget() 的方法可以获取到第i个控件(或widget),最后通过 grid.remove(widget) 这个方法来移除控件widget,

最后还有一个小Tipsremove 后的控件并不会移除,还是会显示出来,真正要删除控件要用snip函数,最后控件才会真正的删除。

代码:

import snip

for i in range(grid.count):
    widget = grid.itemAt(i).widget()
    grid.remove(widget)
    snip.delete(widget)

当运行代码后 

widget = grid.itemAt(i).widget()

  这行代码报错,大致意思是:“NoneType” 类型没有widget这个属性。

??? 怎么会报这个错误,是什么原因?

然后调试后发现,是当 i = 2是才出错,原因是由于我们移除控件是动态移除的,所以当移除了前两个控件后,grid 会变成下图这样,

2x1 的布局,所以再去移除索引为2的控件,就找不到这个控件,所以报错。

还要注意的是,当移除了widget2后,布局就变成了下面第二个图,就只剩下一个控件,索引变成 0 才能删除,否则会报错。

代码:

import snip

for i in range(2):
    for j in range(2):
        if(i == 1 and j == 1):
            j = 0;
            widget = grid.itemAt(i).widget()
            grid.remove(widget)
            snip.delete(widget)

 

 

 

 

 当我们以为就这样就可以的时候,又出现了bug。

原因是snip.delete(widget),将所有的控件都删除了,当我们要重新添加控件的时候就找不到。

我们的解决办法是,先将所有的widget添加的一个 widgetList 列表里面,然后再删除,但是删除了之后,列表里面也没有了,

然后我们发现了widget.hide()函数,不要将控件删除,直接隐藏就不会显示出来,当添加控件的时候需要显示,就用 setHidden(False)设置需要显示的控件为不隐藏,这样就完成了。。。

 

posted @ 2020-09-13 17:10  小黑子杜  阅读(709)  评论(0编辑  收藏  举报