PyQt4嵌套类 - “RuntimeError:底层C / C ++对象已被删除”

时间:2013-02-24 11:00:15

标签: python pyqt4

我正在尝试构建一个很酷的应用程序,但似乎我缺乏一些知识。阅读互联网上的大量信息和示例,但它没有帮助: Understanding the "underlying C/C++ object has been deleted" error


好的,我在这做什么:

我从 main.py 创建中央窗口小部件,工作正常,我不会在此完全发布:

self.rw = ReportWidget()
self.setCentralWidget(self.rw)

这是我的中心部件 - report.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-

from PyQt4 import QtGui, QtCore

class ReportWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(ReportWidget, self).__init__(parent)
        self.setup_ui()

    def setup_ui(self):
        report = QtGui.QVBoxLayout(self)
        report.setAlignment(QtCore.Qt.AlignTop)

        head = QtGui.QHBoxLayout()
        add_label = QtGui.QLabel(u"Add")
        head.addWidget(add_label)

        report.addLayout(head)

        area = QtGui.QScrollArea()
        area.setWidgetResizable(True)
        area.setEnabled(True)
        layout = QtGui.QVBoxLayout()
        layout.setAlignment(QtCore.Qt.AlignTop)
        widget = QtGui.QWidget()
        widget.setLayout(layout)
        area.setWidget(widget)
        report.addWidget(area)

        self.s = layout

        # trying to create first line:
        first_line = Line(self)
        self.s.addWidget(first_line)        
        first_line.set_controls(True, False)

        head = QtGui.QHBoxLayout()
        ok = QtGui.QPushButton(u"Calculate")

        head.addWidget(ok)
        report.addLayout(head)

继续使用相同的文件 report.py

class Line(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Line, self).__init__(parent)
        self.setup_ui(parent)

    def setup_ui(self, parent):
        add_button = QtGui.QPushButton()
        add_button.setObjectName("add_button")

        self.add_button = add_button
        self.layout = QtGui.QHBoxLayout(line)
        self.layout.addWidget(add_button)

    def set_controls(self, add_button=True, remove_button=True):
        self.add_button.setEnabled(add_button)

因此,运行 main.py 会在我尝试RuntimeError: underlying C/C++ object has been deleted参数到新按钮的最后一段代码上引发setEnabled错误,就好像它从未创建或在任何地方都有约束力。

看来我有一些设计缺陷。也许在一个文件中包含不同的类是错误的想法?或者我可能无法控制哪个小部件具有哪个父级以及布局如何工作。


感谢您的阅读。祝你有愉快的一天!

2 个答案:

答案 0 :(得分:1)

感谢所有试图回答的人!不幸的是没有人说我写的一堆垃圾! * *微笑

我的line已经是一个小部件,我不需要自己创建。我所要做的就是在setup_ui内创建布局并为其添加小部件。最后它看起来像:

class Line(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Line, self).__init__(parent)
        self.setup_ui(parent)

    def setup_ui(self, parent):
        line = QtGui.QHBoxLayout(self)

        add_button = QtGui.QPushButton()
        add_button.setObjectName("add_button")

        line.addWidget(add_button)

        # to get reference from outside
        self.add_button = add_button

    def set_controls(self, add_button=True, remove_button=True):
        self.add_button.setEnabled(add_button)

特别感谢nymkAvaris

答案 1 :(得分:0)

我无法使用您向我们展示的代码重现错误(除了line中未定义变量Line.setup_ui的错误之外)。如果我将line替换为self,则表示没有错误。

但是,如果我将line设置为我创建的QWidget并且没有保留引用,我可能会崩溃。换句话说,我添加了

    line = QtGui.QWidget()

Line.setup_ui,发现它在你报告的同一行代码上崩溃,抱怨已经删除了包装好的C / C ++对象。