如何删除pyqt中的QFrame

时间:2014-12-27 02:49:28

标签: python qt ubuntu pyqt

我尝试构建类似于ubuntu软件中心的软件中心GUI。我正在使用pyqt。我在GUI中创建了三个QFrame对象。每个QFrame对象都有不同的用途,一个用于类别,一个用于评级最高的软件,一个用于推荐的软件。这三个帧显示在主GUI屏幕上。搜索关键字后,我想只显示一个包含屏幕结果的帧。因此,当我点击一个按钮时,我需要删除三个帧。我没有找到有关删除帧的任何信息。

我在网上找到的所有内容都是关于从布局中删除小部件。我已经知道并在我的一个框架中实现了这一点。在这个框架中,当我点击一个按钮时,我从框架中删除了一些小部件等。我的代码如下: [R     self.topRatedAppsFrame = QtGui.QFrame(self.centralwidget)     ...

self.horFortopRatedApps = QtGui.QWidget(self.topRatedAppsFrame)
...

self.topRatedAppsList = QtGui.QGridLayout(self.horFortopRatedApps)
...


self.app1 = QtGui.QPushButton(self.horFortopRatedApps)
self.topRatedAppsList.addWidget(self.app1,0,0)


#########this deletes only widget app1 from topRatedAppsList#########
#########but frame still exists and appears in the screen.i #########
######### want to destroy or delete frame topRatedAppsFrame #########
self.topRatedAppsList.removeWidget(self.app1)
self.app1.deleteLater()
self.app1 = None
####################################################################

提示:我想要实现的是在Ubuntu软件中心实现的。 Ubuntu软件中心存在许多帧。当我们搜索某些东西时,一切都消失了,只显示搜索结果。我想做相同的事情。我下载了Ubuntu软件中心并检查了源代码。由于它太复杂了,并且使用了gtk,这个源代码对我没有帮助。我该怎么做?任何指导或想法将不胜感激。

2 个答案:

答案 0 :(得分:1)

删除或删除其他帧可能是错误的方法。

根据需要简单地隐藏/显示帧会更有效。有几种方法可以实现这一点,但QStackedLayout听起来最适合你的目的。您需要做的就是将每组帧添加为堆栈中的单独图层/页面,然后使用setCurrentIndex将所需项目置于顶部。堆叠布局就像一个tab-widget,但没有tab-bar和外框。

修改

这是一个简单的工作演示,展示了如何使用堆叠布局:

from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        def make_frame(text, parent):
            frame = QtGui.QFrame(parent)
            frame.setFrameStyle(QtGui.QFrame.StyledPanel)
            layout = QtGui.QHBoxLayout(frame)
            label = QtGui.QLabel(text, frame)
            label.setAlignment(QtCore.Qt.AlignCenter)
            layout.addWidget(label)
            return frame
        self.splitter = QtGui.QSplitter(self)
        for text in 'ONE TWO THREE'.split():
            self.splitter.addWidget(make_frame(text, self.splitter))
        self.stack = QtGui.QStackedLayout()
        self.stack.addWidget(self.splitter)
        self.stack.addWidget(make_frame('FOUR', self))
        self.button = QtGui.QPushButton('Switch', self)
        self.button.clicked.connect(
            lambda: self.stack.setCurrentIndex(
                int(self.stack.currentIndex() == 0)))
        layout = QtGui.QVBoxLayout(self)
        layout.addLayout(self.stack)
        layout.addWidget(self.button)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 800, 500)
    window.show()
    sys.exit(app.exec_())

答案 1 :(得分:0)

QFrame是QWidget类的子代。在问题中已经解释了删除QWidget。因此,可以以类似的方式删除QFrame。

使用QStackLayout不是此问题的解决方案。因为,窗口中必须同时存在多个活动帧。但是,使用QStackLayout只能同时激活一个QFrame(QWidget),这不适用于这种情况。