PyQt5如何从QWidget中删除图层

时间:2017-07-12 06:00:15

标签: python user-interface layout pyqt

我有一个桌面应用程序主窗口有3个选项卡,在其中一个选项卡中我显示了一些按钮(在for循环中生成),然后当用户单击按钮时,选项卡窗口显示另一个小部件布局中的小部件。

class Tabs(QtWidgets.QTabWidget):
def __init__(self):
    super().__init__()
    self.init_ui()

def init_ui(self):
    self.tab1 = QtWidgets.QWidget()
    self.tab2 = QtWidgets.QWidget()
    self.tab3 = QtWidgets.QWidget()

    self.addTab(self.tab1 , 'TAB1 TITLE')
    self.addTab(self.tab2 , 'TAB2 TITLE')
    self.addTab(self.tab3 , 'TAB3 TITLE')

    self.TAB1Go()
    self.TAB2Go()

    self.show()

def TAB1Go(self):
    # Rest of codes

def TAB2Go(self):

    h_box = QtWidgets.QHBoxLayout()
    v_box = QtWidgets.QVBoxLayout()

    self.WelcomeLabel = QtWidgets.QLabel('Welcome to tab2')
    v_box.addWidget(self.WelcomeLabel)
    self.btn = QtWidgets.QPushButton('push me')
    v_box.addWidget(self.btn)
    self.btn.clicked.connect(self.ShowAnotherWidget)                
    v_box.addStretch()
    v_box.addLayout(h_box)
    self.tab2.setLayout(v_box)


def ShowAnotherWidget(self):
    this_button = self.sender()
    print (this_button.text())
    self.tab2.deleteLayer() #some thing like this
    # self.tab2.setParent(self) < this one delete whole tab2 >




class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.tabs = Tabs()
        self.tabs.doReadCats()
        self.setCentralWidget(self.tabs)
        self.setWindowTitle('ToDo List')
        self.resize(330,500)
        self.show()

app = QtWidgets.QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())

我希望在客户端点击按钮时将tab2布局更改为另一个框或类似的东西

1 个答案:

答案 0 :(得分:0)

The correct solution is to define a function to clear all elements on the layout :

def clearLayout(self, layout):
    for i in reversed(range(layout.count())):
        item = layout.itemAt(i)

        if isinstance(item, QtWidgets.QWidgetItem):
            print ("widget" + str(item))
            item.widget().close()
            # or
            # item.widget().setParent(None)
        elif isinstance(item, QtWidgets.QSpacerItem):
            print ("spacer " + str(item))
            # no need to do extra stuff
        else:
            print ("layout " + str(item))
            self.clearLayout(item.layout())

        # remove the item from layout
        print ('item' + str(item))
        layout.removeItem(item)