【问题标题】:How to dynamically add and delete plot widgets in a QScrollArea?如何在 QScrollArea 中动态添加和删除绘图小部件?
【发布时间】:2021-07-29 14:13:26
【问题描述】:

我有一个带有按钮的 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()

任何人都可以帮助编写一个命令来删除删除按钮所在的“容器”吗?

【问题讨论】:

    标签: python matplotlib pyqt5 qpushbutton qscrollarea


    【解决方案1】:

    逻辑是消除小部件容器,因为如果它被消除,那么它的子容器也是如此,为此,在发出 clicked 信号时调用 deleteLater 方法就足够了。

    dltbtn.clicked.connect(container.deleteLater)
    

    【讨论】:

    • 非常感谢!我对这个问题的思考比我实际需要的要远得多,哈哈
    猜你喜欢
    • 2018-03-14
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多