使用PyQt,我试图创建一个接口,可以动态地添加或删除小部件。我想为要添加或删除的小部件定义一个单独的类。我似乎无法获取我实例化的小部件以显示在主界面中。下面是我使用的代码:
from PyQt4 import QtGui, QtCore
import sys
class Main(QtGui.QMainWindow):
def __init__(self, parent = None):
super(Main, self).__init__(parent)
# central widget
self.centralWidget = QtGui.QWidget(self)
# main layout
self.vLayout = QtGui.QVBoxLayout(self.centralWidget)
# main button
self.pButton_add = QtGui.QPushButton(self.centralWidget)
self.pButton_add.setText('button to add other widgets')
# scroll area
self.scrollArea = QtGui.QScrollArea(self.centralWidget)
self.scrollArea.setWidgetResizable(True)
# scroll area widget contents
self.scrollAreaWidgetContents = QtGui.QWidget(self.scrollArea)
# scroll area widget contents - layout
self.formLayout = QtGui.QFormLayout(self.scrollAreaWidgetContents)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
# add all main to the main vLayout
self.vLayout.addWidget(self.pButton_add)
self.vLayout.addWidget(self.scrollArea)
# set central widget
self.setCentralWidget(self.centralWidget)
# connections
self.pButton_add.clicked.connect(self.addWidget)
def addWidget(self):
z = Test(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount()
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)
class Test(QtGui.QWidget):
def __init__( self, parent):
super(Test, self).__init__(parent)
self.pushButton = QtGui.QPushButton(self)
app = QtGui.QApplication(sys.argv)
myWidget = Main()
myWidget.show()
app.exec_()
问题是,当我在我的“addWidget”方法中使用下面的代码时,它确实执行了我希望它执行的操作,但是类方法似乎不起作用。
z = QtGui.QPushButton(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount())
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)
我想知道为什么z=Test()没有产生任何结果?有什么想法吗?谢谢!
如果你想说,无论何时单击按钮或在程序的任何事件中删除小部件,请使用deleteLater()方法:
self.yourwidget.deleteLater()
self.widget.deleteLater()
使用上面的函数可以使小部件从应用程序中消失
实际上,它确实有效。问题是,
Test
小部件有一个没有任何布局管理的QPushButton
。所以它不能计算它的minimumSize
与考虑的按钮。当你把这个小部件放在一个布局中时,它只是缩小到0
(因为QWidget
没有默认的minimumSize
),你看不到任何东西。您有两个选择,要么手动管理布局并进入一个不必要的痛苦世界,要么依赖于布局管理器。一般来说,你应该更喜欢后者。
我会像这样重新编写你的脚本(虽然我不确定你为什么要使用
QFormLayout
,但我还是保持原样):下面是一个小小的更改,它将使按钮在单击后自动删除:
这样在删除时就不会泄露内存,而且这个按钮实际上可以用来做一些事情。我在下载和块监控方面遵循了几十条进度条的这种模式,即使在线程和多处理方面也很好。而不是简单的QThreads。。。
相关问题 更多 >
编程相关推荐