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()

上下文菜单未使用 PyQt5 显示正确的语言

PyQt5 - 覆盖鼠标光标并设置 Qwidget 透明以一起输入

调用 setParent 时 QMenu 显示不正确

PyQt5 Resize 应用程序以适应不同的显示器

如何更改标签以使用 PyQt5 显示文件路径?