2013-02-24 2 views
1

Я пытаюсь создать классное приложение, но мне кажется, что мне не хватает знаний. Читайте много Infos и примеров в Интернете, но это не помогает: 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 поднимает RuntimeError: underlying C/C++ object has been deleted ошибку на последнем куске кода, где я пытаюсь setEnabled параметра новую кнопку , как будто он никогда не создавался или не связывался нигде.

Кажется, у меня есть некоторые недостатки дизайна. Может быть, неправильная идея иметь разные классы в одном файле или еще? Или, может быть, я не совсем понимаю, какой виджет имеет какой родитель и как работают макеты.


Благодарим за понимание. Хорошего дня!

+1

Кажется, все в порядке, только за исключением 'self.layout = QtGui.QHBoxLayout (line)'. Откуда берется «линия»? Возможно, это должно быть 'self.layout = QtGui.QHBoxLayout (self)'. – nymk

+0

Кроме того, не используйте 'self.layout' как имя. 'layout()' является распространенным методом для виджетов. Он возвращает текущий макет виджета. Вы отменяете это. – Avaris

ответ

0

Я не смог воспроизвести ошибку с кодом, который вы нам показали (кроме ошибки об переменной line, которая не определена в Line.setup_ui). Если я заменил line на self, я не получил никаких ошибок.

Однако я мог бы получить сбой, если бы установил line в QWidget, который я создал и не поддерживал ссылку. Другими словами, я добавил

line = QtGui.QWidget() 

к Line.setup_ui, и обнаружили, что это разбился на той же строке кода вы сообщили, жалуясь, что обернутой C/C++ объект был удален.

+0

Благодарим вас за попытку воспроизвести ошибку, но это было невозможно, потому что я опубликовал только бит кода. Тем не менее ваша идея играть с «линией» и «я» побудила меня к решению. – simno

1

Спасибо всем, кто пытался ответить! К сожалению, никто не сказал, что я написал! * smile *

Мой 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) 

Особая благодарность nymk и Avaris!

Смежные вопросы