1

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


好的,这就是我所做的:

我从我的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.pyRuntimeError: underlying C/C++ object has been deleted会在我尝试将参数设置为新按钮的最后一段代码上引发错误setEnabled,就好像它从未在任何地方创建或绑定一样。

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


感谢您的阅读。祝你今天过得愉快!

4

2 回答 2

1

感谢所有试图回答的人!不幸的是,没有人说我写了一堆废话!*微笑*

Myline已经是一个小部件,我不需要在其内部创建自己。我所要做的就是在里面创建布局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

于 2013-03-03T12:55:35.157 回答
0

我无法使用您向我们展示的代码重现错误(除了关于line未在 中定义的变量的错误Line.setup_ui)。如果我替换lineself,我没有错误。

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

    line = QtGui.QWidget()

to Line.setup_ui,并发现这在您报告的同一行代码上崩溃,抱怨包装的 C/C++ 对象已被删除。

于 2013-02-24T12:53:29.220 回答