Я пытаюсь создать классное приложение, но мне кажется, что мне не хватает знаний. Читайте много 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
параметра новую кнопку , как будто он никогда не создавался или не связывался нигде.
Кажется, у меня есть некоторые недостатки дизайна. Может быть, неправильная идея иметь разные классы в одном файле или еще? Или, может быть, я не совсем понимаю, какой виджет имеет какой родитель и как работают макеты.
Благодарим за понимание. Хорошего дня!
Кажется, все в порядке, только за исключением 'self.layout = QtGui.QHBoxLayout (line)'. Откуда берется «линия»? Возможно, это должно быть 'self.layout = QtGui.QHBoxLayout (self)'. – nymk
Кроме того, не используйте 'self.layout' как имя. 'layout()' является распространенным методом для виджетов. Он возвращает текущий макет виджета. Вы отменяете это. – Avaris