2013-02-24 119 views
1

我試圖建立一個很酷的應用程序,但它似乎我缺乏一些知識。閱讀了大量的相關信息的互聯網和實例,但它並不能幫助: Understanding the "underlying C/C++ object has been deleted" errorPyQt4嵌套類 - 「RuntimeError:底層C/C++對象已被刪除」


好吧,這裏我做什麼:

我從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上的最後一塊代碼,我嘗試setEnabled參數,新的按鈕引發RuntimeError: underlying C/C++ object has been deleted錯誤,就好像它從未在任何地方創建或綁定一樣。

看來我有一些設計缺陷。也許在一個文件或其他文件中使用不同的類是錯誤的想法?或者,我可能無法控制哪個小部件具有哪個父級以及佈局如何工作。


謝謝您的閱讀。祝你今天愉快!

+1

看起來一切正常,只有'self.layout = QtGui.QHBoxLayout(line)'除外。 'line'從哪裏來?也許它應該是'self.layout = QtGui.QHBoxLayout(self)'。 – nymk 2013-02-24 11:31:35

+0

另外,請勿使用'self.layout'作爲名稱。 'layout()'是小部件的常用方法。它返回小部件的當前佈局。你壓倒了它。 – Avaris 2013-02-24 11:52:43

回答

0

我無法用您向我們顯示的代碼重現錯誤(除了在Line.setup_ui中未定義變量line的錯誤外)。如果我用self代替line,我沒有錯誤。

但是,如果我將line設置爲QWidget並且我沒有保留引用,那麼我可能會崩潰。換句話說,我加

line = QtGui.QWidget() 

Line.setup_ui,發現此墜毀在同一行的你報碼,抱怨說,包裝的C/C++對象已被刪除。

+0

謝謝你試圖重現錯誤,但它不是真的可能,因爲我只發佈了一小段代碼。儘管如此,玩'線條'和'自我'的想法促使我找到解決方案。 – simno 2013-03-03 12:57:19

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