setParent 的 PyQt5 行为以显示没有布局的 QWidget
Posted
技术标签:
【中文标题】setParent 的 PyQt5 行为以显示没有布局的 QWidget【英文标题】:PyQt5 behavior of setParent to display QWidget without layout 【发布时间】:2018-03-07 15:09:38 【问题描述】:我的一个小项目使用 PyQt5 出现了一个小问题。我尝试将随机 QWidget(在本例中为 QPushbutton)添加到自定义 QWidget。但是,我不理解“setParent”函数的行为。当我在自定义 QWidget 之外使用它时,会显示 QPushButton。当我在自定义 Widget 的声明函数中使用它时,QPushButton 被遮挡,除了添加布局(我不想要)之外,我没有机会显示它。这里是源代码示例:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class customWidget(QWidget):
def __init__(self):
super().__init__()
self.addButton()
def addButton(self):
button = QPushButton('not_showing')
button.setParent(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
button = QPushButton('showing')
button.setParent(w)
button.move(50,50)
w.resize(600,600)
w.move(1000,300)
w.setWindowTitle('Simple')
w.show()
sys.exit(app.exec_())
在QPushButton初始化过程中添加父级时没有变化。
【问题讨论】:
您的示例有效,因为我在 main 中创建了一个 customWidget 对象,您可以在使用 customWidget 的地方发布您尝试过的代码。不创建对象的类永远不会被调用 【参考方案1】:当addButton函数退出时,按钮被移除。
如果你想看到按钮,试试这个:
class customWidget(QWidget):
def __init__(self):
super().__init__()
self.addButton()
self.button = None
def addButton(self):
if self.button is None:
self.button = QPushButton('not_showing')
self.button.setParent(self)
你在主函数中没有这个问题,因为这个函数在应用程序停止之前不会返回。
编辑:评论是正确的,但您也错过了一些论点。这将起作用
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class customWidget(QWidget):
def __init__(self, parent=None):
super(customWidget, self).__init__(parent)
self.addButton()
def addButton(self):
button = QPushButton('not_showing')
button.setParent(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = customWidget()
button = QPushButton('showing')
button.setParent(w)
button.move(50,50)
w.resize(600,600)
w.move(1000,300)
w.setWindowTitle('Simple')
w.show()
sys.exit(app.exec_())
【讨论】:
这是错误的。该按钮不会被删除,因为它有一个父级。无需为其创建属性。 OPs 代码适用于w = customWidget()
而不是 w = QWidget()
。
谢谢,您的编辑成功了!在将来实施我的 init 时,我必须更加小心。以上是关于setParent 的 PyQt5 行为以显示没有布局的 QWidget的主要内容,如果未能解决你的问题,请参考以下文章
Pyqt5 deleteLater() VS sip.delete()