尽管更新了小部件,但 Pyqt5 更新的小部件未添加到布局中

Posted

技术标签:

【中文标题】尽管更新了小部件,但 Pyqt5 更新的小部件未添加到布局中【英文标题】:Pyqt5 updated Widget is not added to the layout though the widget is updated 【发布时间】:2017-10-09 01:54:55 【问题描述】:

我试图在单击按钮时显示一组操作,如果单击另一个按钮,则显示其他选项集。 下面是代码:

  class Screen(QWidget):
    def __init__(self):
        super(Screen, self).__init__()
        layout = QHBoxLayout(self)
        self.all_running()
        layout.addWidget(self.running_full_widget)
        self.actions('1')
        layout.addWidget(self.actions_full_widget)
        self.setLayout(layout)
        self.show()
    def all_running(self):
        self.running_full_widget = QWidget()
        runnning_full_layout= QVBoxLayout()
        button1 = QPushButton("btn1")
        button2 = QPushButton("btn2")
        button1.clicked.connect(lambda: self.actions('2'))
        button2.clicked.connect(lambda: self.actions('3'))
        runnning_full_layout.addWidget(button1)
        runnning_full_layout.addWidget(button2)
        self.running_full_widget.setLayout(runnning_full_layout)
    def actions(self,value):
        self.actions_full_widget= QWidget()
        val = int(value)
        print(val)
        actions_layout = QVBoxLayout()
        for i in range(val):
           actions_item = QLabel(str(i))
           actions_layout.addWidget(actions_item)
        self.actions_full_widget.setLayout(actions_layout)

app = QApplication(sys.argv)
Gui = Screen()
sys.exit(app.exec_())

单击按钮时,我可以看到值已更新,但在主布局中未更新。 如何动态更新小部件? 如果我需要基于动态值添加小部件,我该怎么做。 我错过了信号和插槽的任何东西吗? 如果我错了,请纠正我。谢谢

【问题讨论】:

【参考方案1】:

您的代码几乎就在那里。您看到的问题是小部件被添加但从未被删除。以下代码可以简化,但我尽量将其与您的代码保持一致,以便您更轻松地查看更改。

主要变化是现在有一个类成员screen_layout,并且在actions() 中添加/删除了小部件。

import sys
from PyQt5.QtWidgets import QHBoxLayout, QVBoxLayout, QWidget, QPushButton, QLabel, QApplication

class Screen(QWidget):
    def __init__(self):
        super(Screen, self).__init__()
        layout = QHBoxLayout(self)
        self.screen_layout = layout
        self.all_running()
        layout.addWidget(self.running_full_widget)
        self.actions_full_widget = None
        self.actions('1')
        # layout.addWidget(self.actions_full_widget)
        self.setLayout(layout)
        self.show()
    def all_running(self):
        self.running_full_widget = QWidget()
        runnning_full_layout= QVBoxLayout()
        button1 = QPushButton("btn1")
        button2 = QPushButton("btn2")
        button1.clicked.connect(lambda: self.actions('2'))
        button2.clicked.connect(lambda: self.actions('3'))
        runnning_full_layout.addWidget(button1)
        runnning_full_layout.addWidget(button2)
        self.running_full_widget.setLayout(runnning_full_layout)
    def actions(self,value):
        # Remove any previously added widget
        if self.actions_full_widget is not None:
            self.screen_layout.removeWidget(self.actions_full_widget)
            self.actions_full_widget.deleteLater()
        self.actions_full_widget= QWidget()
        val = int(value)
        print(val)
        actions_layout = QVBoxLayout()
        for i in range(val):
           actions_item = QLabel(str(i))
           actions_layout.addWidget(actions_item)
        self.actions_full_widget.setLayout(actions_layout)
        self.screen_layout.addWidget(self.actions_full_widget)

app = QApplication(sys.argv)
Gui = Screen()
sys.exit(app.exec_())

【讨论】:

感谢您的回复。是的,当我删除以前的布局时它正在工作。 我正在尝试制作可点击的动态小部件。一切正常,但问题是所有动态小部件都指向最后一个小部件。我尝试使用 sender 和其他方法。我们如何解决这个问题?下面我在答案中发布代码。 你在问另一个关于一些不同代码的问题。那真的应该在另一篇文章中。这绝对不是最初发布问题的“答案”。 抱歉,我在现有代码中添加了其他内容。我会把它作为另一个问题发布。 我在下面发布了一个不同的问题,Link 请建议我任何可能的解决方案。再次抱歉

以上是关于尽管更新了小部件,但 Pyqt5 更新的小部件未添加到布局中的主要内容,如果未能解决你的问题,请参考以下文章

使用堆栈的拖动小部件更新所有附加的小部件

例外:-尽管删除了扩展的小部件,但没有布置 RenderBox

如何更新不同大小的小部件?

不定期更新小部件

通过 AppWidgetManager 更新我自己的小部件时,电源控制小部件显示一小会儿,这是啥问题?

小部件不会更新/重绘