我有一个QDialog,包含一个QTabWidget,它的标签大小不一。以下是 本说明,这些都是类似于另一个 溢出答案我有以下代码(self.tabs是一个标签小部件的字典)。
class Panel(NXDialog):
def __init__(self, panel, parent=None):
super(Panel, self).__init__(parent)
self.tabwidget = QtWidgets.QTabWidget()
self.tabwidget.currentChanged.connect(self.update)
...
@property
def tab(self):
return self.tabwidget.currentWidget()
def update(self):
if self.tabwidget.count() == 0:
self.setVisible(False)
else:
for tab in [tab for tab in self.tabs if tab is not self.tab]:
try:
self.tabs[tab].setSizePolicy(QtWidgets.QSizePolicy.Ignored,
QtWidgets.QSizePolicy.Ignored)
self.tabs[tab].update()
except Exception:
pass
self.tab.setSizePolicy(QtWidgets.QSizePolicy.Preferred,
QtWidgets.QSizePolicy.Preferred)
self.tab.update()
self.adjustSize()
当我添加一个新的标签时,它的工作非常好。标签确实按照我的要求调整了大小。然而,随后对标签选择的更改没有任何效果,即使我的调试器确认这个更新函数被调用。
我的应用程序有一个嵌入式shell,它与GUI共享一个命名空间,所以我可以处理所有的PyQt小组件。如果我调用 tab.adjustSize()
在shell中,tab指向所选的tab,tab确实调整了大小! 所以我的问题是,为什么 adjustSize
函数被忽略,当我进行选择并触发了 currentChanged
信号,但当我稍后从 shell 调用相同的 slot 函数时,却没有被忽略。我试过添加一个睡眠时间,并递归循环地在父部件中调用 adjustSize
但没有任何效果。我也试过添加 self.repaint()
以及以编程方式改变焦点,然后再返回,但除了在shell中输入外,没有任何工作。
我在Python 3.8上运行PyQt5 v5.12.5,但我在PyQt v5.9上得到了同样的行为。
另一个 stackoverflow问题 已经帮我解决了这个问题。看来,之前在 SizePolicy
可能还在GUI事件循环中等待。首先清除循环,确保 adjustSize
作品。
这就是所需要的一切。
QtWidgets.QApplication.instance().processEvents()
self.adjustSize()
我承认我很惊讶这个问题以前没有出现在我身上,但我希望这对有同样问题的人有帮助。