从不同 类 中删除和添加小部件
Delete and add widget from different classes
如何从其他 class 中删除小部件?
我有下面的代码,想使用“删除”按钮删除“fig_view2”,然后再添加其他小部件。
“删除”按钮和 fig_view2 来自不同的 class。
试图通过下面的函数删除但错误
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_())
您应该考虑以下几点:
每个class必须负责管理其内部元素,在这种情况下,必须消除其内部小部件的是同一个class。
removeWidget方法不会删除widget,它只是意味着布局将不再处理它的几何图形,如果你想删除一个widget使用deleteLater()方法。
如果你想访问一个从另一个地方访问的变量,那么你必须通过class.
的属性来实现
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)
如何从其他 class 中删除小部件? 我有下面的代码,想使用“删除”按钮删除“fig_view2”,然后再添加其他小部件。 “删除”按钮和 fig_view2 来自不同的 class。 试图通过下面的函数删除但错误
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_())
您应该考虑以下几点:
每个class必须负责管理其内部元素,在这种情况下,必须消除其内部小部件的是同一个class。
removeWidget方法不会删除widget,它只是意味着布局将不再处理它的几何图形,如果你想删除一个widget使用deleteLater()方法。
如果你想访问一个从另一个地方访问的变量,那么你必须通过class.
的属性来实现
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)