为什么我不能强制PyQt标签式小组件调整大小?[重复]

问题描述 投票:0回答:1

我有一个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上得到了同样的行为。

python pyqt pyqt5
1个回答
0
投票

另一个 stackoverflow问题 已经帮我解决了这个问题。看来,之前在 SizePolicy 可能还在GUI事件循环中等待。首先清除循环,确保 adjustSize 作品。

这就是所需要的一切。

        QtWidgets.QApplication.instance().processEvents()        
        self.adjustSize()

我承认我很惊讶这个问题以前没有出现在我身上,但我希望这对有同样问题的人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.