Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PyQt5中删除小部件时如何删除黑色空间_Python_Layout_Pyqt5_Qt5_Qpushbutton - Fatal编程技术网

Python 在PyQt5中删除小部件时如何删除黑色空间

Python 在PyQt5中删除小部件时如何删除黑色空间,python,layout,pyqt5,qt5,qpushbutton,Python,Layout,Pyqt5,Qt5,Qpushbutton,我有一个代码来生成一个带有PyQt5的GUI,它允许用户基于一个条目(QLineEdit)创建多个按钮(QPushButton),并在按下“X”按钮(deleteLater())时删除这些按钮 我的问题是,当按下相关的X按钮删除其中一些按钮时,会在按钮最初所在的位置留下一个小的空白,因此我想知道如何删除这些空白 空空间的图像 从PyQt5.qtwidts导入QApplication、QMainWindow、QPushButton、QLineEdit、QWidget、QVBoxLayout、QH

我有一个代码来生成一个带有PyQt5的GUI,它允许用户基于一个条目(QLineEdit)创建多个按钮(QPushButton),并在按下“X”按钮(deleteLater())时删除这些按钮

我的问题是,当按下相关的X按钮删除其中一些按钮时,会在按钮最初所在的位置留下一个小的空白,因此我想知道如何删除这些空白

空空间的图像

从PyQt5.qtwidts导入QApplication、QMainWindow、QPushButton、QLineEdit、QWidget、QVBoxLayout、QHBoxLayout、QGridLayout、QGroupBox、QScrollArea、QLabel
从PyQt5.QtCore导入Qt
导入系统
类MyWindow(QMainWindow):
定义初始化(自):
超级(MyWindow,self)。\uuuuu init\uuuuuuu()
self.setWindowTitle(“我的程序”)
self.setGeometry(10010015001500)
self.initUI()
def initUI(self):
widgets=MainWidgets()
self.setCentralWidget(小部件)
类MainWidgets(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.initUI()
def initUI(self):
self.grid=QGridLayout()
self.grid.setColumnStretch(0,1)
self.grid.setColumnStretch(1,1)
self.grid.setColumnStretch(2,1)
self.grid.setColumnStretch(3,1)
self.grid.setColumnStretch(4,1)
self.groupBox=QGroupBox(“标签”)
self.groupBox.setStyleSheet(“”)
QGroupBox::title{
分控位置:上止点;
}
''')
右\列\布局=QVBoxLayout(self.groupBox)
scrollArea=QScrollArea()
scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
scrollArea.SetWidgetResizeable(真)
右\u列\u布局.addWidget(滚动区域)
scrollArea.setWidget(RightColWidgets())
self.grid.addWidget(self.groupBox,0,5,1,5)
self.setLayout(self.grid)
类RightColWidgets(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.initUI()
def initUI(self):
self.layout=QVBoxLayout(self)
self.labelEntry=QLineEdit(self)
self.addLabelButton=QPushButton(self)
self.addLabelButton.setText(“添加标签”)
self.addLabelButton.clicked.connect(self.addNewLabel)
self.emptyspace=QLabel(self)
self.layout.addWidget(self.labelEntry,stretch=0)
self.layout.addWidget(self.addLabelButton,stretch=0)
self.layout.addWidget(self.emptyspace,stretch=1)
def addNewLabel(自我):
labelname=self.labelEntry.text()
newLabelItems=标签(self,labelname)
self.layout.insertWidget(2,newLabelItems)
类标签(QWidget):
定义初始化(self、parent、labelname、*args、**kwargs):
super()
self.mylabelname=labelname
self.initUI()
def initUI(self):
self.labelButton=QPushButton(self)
self.labelButton.setText(str(self.mylabelname))
self.labelButton.setStyleSheet(“”)
QPushButton{边框:1px实心背面;背景:rgba(1031861810.5);顶部填充:10px;底部填充:10px}
""")
self.labelButton.clicked.connect(self.printbutton)
self.buttonErase=QPushButton(self)
self.buttonErase.setText(“X”)
self.buttonErase.setStyleSheet(“”)
QPushButton{边框:1px实心背面;右侧填充:5px;左侧填充:5px;顶部填充:10px;底部填充:10px}
""")
self.button删除.单击.连接(self.橡皮擦按钮)
布局=QHBoxLayout(自身)
layout.setContentsMargins(0,0,0,0)
layout.addWidget(self.labelButton,stretch=1)
layout.addWidget(self.buttonErase,stretch=0)
def打印按钮(自):
打印('单击:',self.labelButton.text())
def擦除按钮(自身):
self.labelButton.deleteLater()
self.buttonErase.deleteLater()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QApplication(sys.argv)
#应用程序设置样式(“融合”)
window=MyWindow()
window.showMaximized()
sys.exit(app.exec_())

删除子项不会删除容器,因此您看到的是空的
标签
小部件,其布局间隔为
contentsMargins()

一个简单的解决方案是直接将按钮与其自己的
deleteLeter()
连接,该按钮会自动删除其子项:

        self.buttonErase.clicked.connect(self.deleteLater)
更好的解决方案是将信号连接到父级,并让它以更干净的方式执行所有必要的操作,因为您可能需要跟踪现有的小部件(例如,从当前现有标签列表中删除它们):

显然,在这种情况下,您不再需要在
标签
类的
initUi
中连接
单击的
信号


请注意,这是任何QWidget的现有(和动态)属性,因此您不应该覆盖它。

非常感谢!
class RightColWidgets(QWidget):
    # ...

    def addNewLabel(self):
        labelname = self.labelEntry.text()
        newLabelItems = Labels(self, labelname)

        self.layout.insertWidget(2, newLabelItems)
        newLabelItems.buttonErase.clicked.connect(
            lambda: self.deleteLabel(newLabelItems))

    def deleteLabel(self, widget):
        self.layout.removeWidget(widget)
        widget.deleteLater()