1

クールなアプリを作ろうとしていますが、知識が不足しているようです。インターネットで多くの情報と例を読んでください


わかりました、ここで私がすること:

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 つのファイルに異なるクラスを含めるのは間違っているのでしょうか。または、どのウィジェットがどの親を持ち、レイアウトがどのように機能するかを完全に制御できないかもしれません。


読んでくれてありがとう。良い1日を!

4

2 に答える 2

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に感謝します。

于 2013-03-03T12:55:35.157 に答える
0

表示されたコードではエラーを再現できませんでした (変数lineが で定義されていないというエラーは別としてLine.setup_ui)。に置き換えlineた場合self、エラーは発生しませんでした。

ただし、作成した参照を保持していないに設定lineすると、クラッシュする可能性があります。QWidgetつまり、私は追加しました

    line = QtGui.QWidget()

Line.setup_ui、ラップされた C/C++ オブジェクトが削除されたと不平を言って、報告したコードと同じ行でこれがクラッシュしたことがわかりました。

于 2013-02-24T12:53:29.220 に答える