Удалить и добавить виджет из разных классов - PullRequest
1 голос
/ 04 августа 2020

Как удалить виджет из другого класса? У меня есть код ниже, и я хотел использовать кнопку «Удалить», чтобы удалить «fig_view2», а затем добавить другой виджет позже. Кнопка «Удалить» и fig_view2 относятся к разным классам. Пытался удалить с помощью функции ниже, но ошибка

def DeleteWidget(self):
    Tab1.layoutC2.removeWidget(fig_view2)

Сообщение об ошибке: "AttributeError: объект типа 'Tab1' не имеет атрибута 'layoutC2'"

from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
from PyQt5.QtWidgets import ( QApplication, QWidget,QVBoxLayout,QPushButton,QTabWidget,QMainWindow,QGridLayout,QCompleter,QScrollArea,QWidget)
from PyQt5.QtWebEngineWidgets import *


class Win(QMainWindow):
    def __init__(self):
        super().__init__()    
        self.setGeometry(100,100, 300,300)
        self.GuiApp=App()
        self.setCentralWidget(self.GuiApp)
        self.show()

class Tab1(QWidget):
    def __init__(self, parent=None):
        super(Tab1, self).__init__(parent)
        fig_view1 = QWebEngineView(self)
        fig_view1.show()
        fig_view2 = QWebEngineView(self)
        fig_view2.show()
        layoutC2 = QGridLayout()
        layoutC2.removeWidget(fig_view1)
        layoutC2.addWidget(fig_view1,0,0)
        layoutC2.addWidget(fig_view2,0,1)
        
        self.setLayout(layoutC2)

class App(QWidget):
    def __init__(self):
        super().__init__()
        self.layout = QGridLayout(self)
        self.setLayout(self.layout)
        #Button
        BT1 = QPushButton('Remove',self)
        BT1.clicked.connect(self.DeleteWidget)
        self.layout.addWidget(BT1, 0,0,1,1)
        

        self.tab1 = Tab1(self)
        self.scrollbar = QScrollArea(widgetResizable= True)
        self.scrollbar.setWidget(self.tab1)
        self.tabwidget = QTabWidget()
        self.tabwidget.addTab(self.scrollbar,"Tab1")
        self.layout.addWidget(self.tabwidget, 0,2,13,1)

    def DeleteWidget(self):
        Tab1.layoutC2.removeWidget(fig_view2)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Win()
    sys.exit(app.exec_())

1 Ответ

3 голосов
/ 04 августа 2020

Вы должны учитывать следующее:

  • Каждый класс должен нести ответственность за управление своими внутренними элементами, и в этом случае тот, который должен устранить свой внутренний виджет, является тем же классом.

  • Метод removeWidget не удаляет виджет, это только означает, что макет больше не будет обрабатывать свою геометрию, если вы хотите удалить виджет, используйте метод deleteLater ().

  • Если вы хотите получить доступ к переменной, доступ к которой осуществляется из другого места, вы должны сделать это через атрибуты класса.

class Tab1(QWidget):
    def __init__(self, parent=None):
        super(Tab1, self).__init__(parent)
        self.fig_view1 = QWebEngineView()
        self.fig_view2 = QWebEngineView()

        self.lay = QGridLayout(self)
        self.lay.addWidget(self.fig_view1, 0, 0)
        self.lay.addWidget(self.fig_view2, 0, 1)

    def removefig2(self):
        if self.fig_view2 is not None:
            self.lay.removeWidget(self.fig_view2)
            self.fig_view2.deleteLater()
            self.fig_view2 = None


class App(QWidget):
    def __init__(self):
        super().__init__()
        
        # Button
        button_bt1 = QPushButton("Remove")
        

        self.lay = QGridLayout(self)
        self.lay.addWidget(button_bt1, 0, 0, 1, 1)

        self.tab1 = Tab1()
        self.scrollbar = QScrollArea(widgetResizable=True)
        self.scrollbar.setWidget(self.tab1)
        self.tabwidget = QTabWidget()
        self.tabwidget.addTab(self.scrollbar, "Tab1")
        self.lay.addWidget(self.tabwidget, 0, 2, 13, 1)

        button_bt1.clicked.connect(self.tab1.removefig2)
...