我正在尝试构建一个很酷的应用程序,但似乎我缺乏一些知识。阅读互联网上的大量信息和示例,但它没有帮助: 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
错误,就好像它从未创建或在任何地方都有约束力。
看来我有一些设计缺陷。也许在一个文件中包含不同的类是错误的想法?或者我可能无法控制哪个小部件具有哪个父级以及布局如何工作。
感谢您的阅读。祝你有愉快的一天!
答案 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)
答案 1 :(得分:0)
我无法使用您向我们展示的代码重现错误(除了line
中未定义变量Line.setup_ui
的错误之外)。如果我将line
替换为self
,则表示没有错误。
但是,如果我将line
设置为我创建的QWidget
并且没有保留引用,我可能会崩溃。换句话说,我添加了
line = QtGui.QWidget()
到Line.setup_ui
,发现它在你报告的同一行代码上崩溃,抱怨已经删除了包装好的C / C ++对象。