问题描述
我有一个带按钮的 GUI;我在界面的另一个选项卡中的滚动区域中添加了一个新的 matplotlib 图。我可以多次这样做。问题是我想添加一个功能,其中“删除”按钮仅删除他所在的小部件。
这是我所拥有的最小可重复示例:
import sys
from PyQt5.QtWidgets import (
QApplication,QMainWindow,QWidget,QPushButton,QVBoxLayout,QHBoxLayout,QTabWidget,QScrollArea,)
from matplotlib.backends.backend_qt5agg import figureCanvasQTAgg as figureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import figure
class MainWindow(QMainWindow):
def __init__(self,parent=None):
super(MainWindow,self).__init__(parent)
# Window
self.setwindowTitle("DataVisualizationPrototype")
self.setGeometry(400,200,900,800)
self.activateWindow()
self.raise_()
self.tab_widget = TabWidget()
self.setCentralWidget(self.tab_widget)
class TabWidget(QTabWidget):
def __init__(self,parent=None):
super(TabWidget,self).__init__(parent)
self.tab1 = QWidget()
self.plot_button = QPushButton("Add plot")
lay = QVBoxLayout(self.tab1)
lay.addWidget(self.plot_button)
self.tab2 = QWidget()
self.scroll_area = QScrollArea()
self.scroll_container = QWidget()
self.scroll_area.setWidgetResizable(True)
self.scroll_area.setWidget(self.scroll_container)
self.scroll_layout = QHBoxLayout(self.scroll_container)
lay = QVBoxLayout(self.tab2)
lay.addWidget(self.scroll_area)
self.addTab(self.tab1,"Home")
self.addTab(self.tab2,"Comparison")
self.plot_button.clicked.connect(self.plot)
def plot(self):
canvas = figureCanvas(figure())
ax = canvas.figure.add_subplot(111)
toolbar = NavigationToolbar(canvas,self)
dltbtn = QPushButton("Remove")
container = QWidget()
lay = QVBoxLayout(container)
lay.addWidget(canvas)
lay.addWidget(toolbar)
lay.addWidget(dltbtn)
self.scroll_layout.addWidget(container)
container.setMinimumWidth(400)
ax.plot([1,2,3,4])
ax.set_ylabel("some numbers")
def main():
app = QApplication(sys.argv)
view = MainWindow()
view.show()
sys.exit(app.exec())
if __name__ == "__main__":
main()
解决方法
逻辑是消除小部件容器,因为如果它被消除,那么它的子代也会被消除,为此,在发出 clicked 信号时调用 deleteLater 方法就足够了。
dltbtn.clicked.connect(container.deleteLater)