我正在尝试构建一个很棒的应用程序,但似乎我缺乏一些知识。在Internet上阅读了大量的信息和示例,但这无济于事:
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参数设置为new按钮的最后一段代码中出现setEnabled错误,就好像它从未创建或绑定到任何地方一样。

看来我有一些设计缺陷。在一个文件或其他文件中拥有不同的类也许是错误的想法?或者,也许我不能完全控制哪个窗口小部件具有哪个父对象以及布局如何工作。



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

最佳答案

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

我的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

关于python - PyQt4嵌套类-“RuntimeError:基础C/C++对象已被删除”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15051090/

10-12 16:54