前のquestionを参照すると、私のアプリケーションで参照を保持するための助けが必要です。Qt - Pythonでウィジェットの参照を保持する
最初に私のコードからスニペット。
from PyQt4 import QtGui
import os, os.path
import sys
class mainWindowHandler():
equationEditor = []
_listview = None
_window = None
def __init__(self):
return
def showAddEquation(self):
"""Creates a new instance of the dynamic editor for adding an equation"""
#create a horizontal split layout
window = QtGui.QWidget()
layout = QtGui.QHBoxLayout()
current = len(self.equationEditor) - 1
de = QtGui.QPushButton(str(current))
self.equationEditor.append(de)
de.clicked.connect(self.clicked)
#fill list view with items from equation collection
listview = QtGui.QListWidget()
for equation in self.equationEditor:
item = QtGui.QListWidgetItem()
item.setText(equation.text())
listview.addItem(item)
layout.addWidget(listview)
layout.addWidget(de)
window.setWindowTitle("Equation {}".format(str(current))
window.setLayout(layout)
self._window = window
self._listview = listview
window.show()
return window
def clicked(self):
"""Method for handling the button events in the solver settings\n
signal = the button hit\n"""
return self.showAddEquation()
if __name__ == "__main__":
path = os.path.dirname(os.path.abspath(__file__))
app = QtGui.QApplication(sys.argv)
ewh = mainWindowHandler()
window = ewh.showAddEquation()
sys.exit(app.exec_())
(後に)特定の設定の操作を可能にするウィンドウを作成するアプリケーション - QPushButton
で表される私のコード例では。これらの設定は後でtxtファイルに書き込まれますが、それまではウィジェットの形式で保存されます。ウィジェットをコレクションに追加してそこから呼び出すだけです。これはPythonレベルでうまくいきます。
今、ウィンドウの内側からウィンドウの新しいインスタンスを作成するボタンがあります。それも動作します。しかし、3つ目のインスタンスまで。その時点で私はQtレベルの私のQPushButton
への参照を失いました。私のコレクション(equationEditor
)からボタンを取得しようとしたとき、私は
wrapped C/C++ object of type `QPushButton` has been deleted
エラーが発生します。 Pythonではまだそれらが存在しますが、明らかに対応するQtオブジェクトはどこかで参照を誤ってしまったために破壊されます。
誰かがより良い解決策を示したり、私が参照を保持する方法を指摘できますか? おかげで...
編集:私は詳細に少しより多くの機能を説明しようとするいくつかの混乱があるように思えたよう 。
プログラムが起動し、QListView
とQPushButton
が「1」のウィンドウ「式1」が作成されます。リストビューには、利用可能なすべてのQPushButton
が表示されます(開始時に1項目のみ)。私の実際のプログラムではQPushButton
はQWidget
で、一部のテキストフィールドとQPushButton
です。
ユーザーが「1」をクリックすると、「1」ボタンが消え、「1」の位置に「2」という名前の新しいインスタンスQPushButton
が表示されます。さらに、リストビューは2つの項目「1」と「2」を保持するはずであり、ウィンドウのタイトルは「式2」でなければなりません。それが新しいウィンドウであるか、以前と同じ新しいコンテンツでは関連性がありません。両方の変種は大丈夫でしょう。前者は現時点で実装されている方法です。表示は一度に1つのウィンドウで行う必要があります。
QPushButton
のすべてのインスタンスは、小さなリスト(equationEditor
と呼ばれます)で収集してメモリに保持する必要があります。私の実際のプログラムでは、これは変更を一時ファイルに書き込まずにウィジェット内のすべての変更を保存するために使用されます。
その後、ユーザが選択した場合、項目「1」、現在可視QPushButton
が(コレクションequationEditor
から)QPushButton
「1」に置き換えなければならないQListView
または彼は2番目の項目を選択した場合QPushButton
「2」べき示される。
なぜですか? 後で使用されるウィジェットには、多くの編集可能なデータが含まれています。ユーザーはいつでもその情報を編集できるので、すべてのデータを再度再投入するのではなく、ウィジェットを表示せずにウィジェットをメモリに保持する方が簡単です。ユーザがQListView
で1つを選択するとすぐに、ウィジェット内のデータを再び編集できるように、対応するウィジェットをウィンドウに表示する必要があります。
あなたのコード例のおかげで。私はそれを見ます。トリッキーな部分は、リストビュー内の対応する項目が選択されたときに、メモリからウィンドウを呼び出すことになります。 – RaJa
今のように、listviewの数字は、ちょうど 'equationEditor'リスト内の対応する' ShowAddEquation'インスタンスのインデックスです。だから問題はないはずです。 – ImportanceOfBeingErnest
これは正しいです。リストビューでアイテムが選択されると、現在表示されているプッシュボタンが非表示になり、アイテムにリンクされているプッシュボタンが現在のウィンドウに表示されます。そのため、実際には 'ShowAddEquation'ではなく' equationEditor'にPushButtonを追加しています。最後に、アイテムを選択するときに右の視界が変化するウィンドウ(PushButton)が表示され、ユーザーがボタンを押したときに再作成されるウィンドウが表示されます。 – RaJa