У меня есть небольшое приложение для панели инструментов, где я могу динамически добавлять и удалять графики. Проблема в том, что когда я нажимаю кнопку x (виджет уничтожения графа), график исчезает из вида, но оставляет пустоту над верхним оставшимся графиком (см. Прикрепленный скриншот).
Я в значительной степени полный новичок в этом, но я подозреваю, что я не имею дело с удалением виджетов и объектов правильно?
В моем упрощенном коде ниже у меня есть класс dashboard_tab
, где через нажатие кнопки я создать объект add_new_graph
, который создает новый виджет графика self.graphWidget = pg.PlotWidget()
.
При инициации закрытия (или уничтожения) виджета графика я вызываю следующий код:
def kill_widget(self):
self.lay.removeWidget(self.graphWidget)
self.graphWidget.deleteLater()
self.graphWidget = None
Это как-то кажется работать, так как графический виджет исчезает из вида, а не нежелательной пустоты.
Тогда я также хотел убить объект add_new_graph
... если он как-то связан с моей проблемой ... возможно, создав сигнал от объекта add_new_graph
обратно к dashboard_tab
объект ... но он не может заставить это работать.
Итак, мои вопросы:
- Какова наиболее вероятная причина нежелательной пустоты после удаления виджета?
- Нужно ли также удалять объект, чтобы иметь правильное кодирование?
Любые точки в правильном направлении приветствуются!
class MainWindow(QtWidgets.QWidget):
def __init__(self, parent):
super(QtWidgets.QWidget, self).__init__(parent)
self.layout = QtWidgets.QVBoxLayout(self)
self.tab_holder = QtWidgets.QTabWidget()
tab1 = dashboard_tab()
self.tab_holder.addTab(tab1, "Dashboard")
self.layout.addWidget(self.tab_holder)
class dashboard_tab(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.lay = QtWidgets.QVBoxLayout(self)
self.numGraphs = 0
addGraphBtn = QtWidgets.QToolButton()
addGraphBtn.setText(" Add Graph")
addGraphBtnMenu = QtWidgets.QMenu()
addGraphBtnMenu.addAction('Add Temp Graph', self.add_graph)
addGraphBtn.setMenu(addGraphBtnMenu)
self.lay.addWidget(addGraphBtn)
def add_graph(self):
# Create a unique graph name
self.name = ("graph" + str(self.numGraphs))
self.graph = add_new_graph(self.name)
self.lay.addWidget(self.graph)
# Up graph name index every time a new graph is created
self.numGraphs += 1
class add_new_graph(QtWidgets.QWidget):
def __init__(self, name):
super().__init__()
self.name = name
self.lay = QtWidgets.QHBoxLayout(self)
self.graphWidget = pg.PlotWidget()
self.killWidgetBtn = QtWidgets.QPushButton('')
self.killWidgetBtn.clicked.connect(self.kill_widget)
self.lay.addWidget(self.killWidgetBtn)
self.lay.addWidget(self.graphWidget)
def kill_widget(self):
self.lay.removeWidget(self.killWidgetBtn)
self.killWidgetBtn.deleteLater()
self.killWidgetBtn = None
self.lay.removeWidget(self.graphWidget)
self.graphWidget.deleteLater()
self.graphWidget = None
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
Снимок экрана приложения Dashboard