問題タブ [slots]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Qt5 カスタム WindowClose シグナルを別のウィンドウに接続する
あるクラスから別のクラスのスロットに信号を接続しようとしていますが、接続するとアプリケーションが起動時にクラッシュします。ここの他の投稿と、カスタムシグナルを接続することを逃れたQtフォーラムを読みましたが、それらを間違って接続していると思います。どんな助けでも大歓迎です。
管理ウィンドウ.h
管理ウィンドウ.cpp
MainWindow.cpp
c++ - 接続のシグナルには引数があるのに、スロットには引数がないのはなぜですか?
Qt 4.8.1、元のコードは次のとおりです。
これは本当に私を混乱させます.[質問]QObject::connectを使用するときにスロット関数に引数を渡すことはできますか? それは引数が一致する必要があることを教えてくれましたが、ここで何が起こるか、その引数を削除するとコードが間違ってしまいます。
python - __slots__ を持つクラスで __setattr__() を定義できますか?
を定義するクラスがあるとします__slots__
:
それを定義できます__setattr__()
か?
Foo
がないので、__dict__
何を更新しますか?
python - 既に __slots__ を定義しているクラスのデコレータに __slots__ を追加することはできますか?
まず、スロットとメタクラスが Python でどのように機能するかを理解していると言うことから始めましょう。この 2 つをいじっていると、興味深い問題に遭遇しました。最小限の例を次に示します。
これにより、次の例外が発生します。
スロット用に作成された記述子は、スロットx
用に予約されたスペースを参照できる必要があります。クラス A のインスタンス、または A のサブクラスのインスタンスのみがこの予約領域を持っているため、これらのインスタンスのみが記述子を使用できますx
。上記の例では、メタクラスは A の基底クラスのサブクラスである新しい型を作成しますが、A 自体のサブクラスではないため、例外が発生します。十分に単純です。
もちろん、この単純な例では、次の 2 つの定義のいずれかでdecorator
問題を回避できます。
しかし、これらの回避策は、どちらも基本クラスとして A を追加するため、元の回避策とまったく同じではありません。より複雑な設定では失敗する可能性があります。たとえば、継承ツリーがより複雑な場合、次の例外が発生する可能性があります: TypeError: multiple bases have instance lay-out conflict
.
したがって、私の非常に具体的な質問は次のとおりです。
への呼び出しを介して、既存のクラスtype
の属性を変更する__slots__
が、既存のクラスを新しいクラスの基本クラスとして追加しない新しいクラスを作成する方法はありますか?
編集:
上記の例では、厳密なメタクラスが別の回避策であることを知っています。最小限の例を機能させる方法はたくさんありますが、私の質問はnew
、例を機能させる方法ではなく、既存のクラスに基づいてクラスを作成することです。混乱させて申し訳ありません。
編集2:
コメントでの議論により、最初に尋ねたものよりも正確な質問が得られました。
への呼び出しを介して、type
そのクラスの子孫ではなく、既存のクラスのスロットと記述子を使用するクラスを作成することは可能ですか?
答えが「いいえ」の場合、その理由について情報源をいただければ幸いです。
python - Python で属性の作成を制限するための __setattr__ と __slots__ の比較
特に、ユーザーが新しい属性を動的に作成できないようにすることで、Python クラスの動的性を低下させる方法について読んでいます。オーバーロード__setattr__
はこれを行う良い方法であり、進むべき道で__slots__
はないことを読みました。この最後のスレッドの1 つの投稿は、__slots__
ピクルス化を中断する可能性があることを実際に示唆しています。(誰かこれを確認できますか?)
ただし、Python 2.2 の whatsnew を読んだだけで、属性アクセス セクション__slots__
では、他の人が提案したような最適化のためだけでなく、属性の作成を制限する目的で使用することを実際に提案しています。Python の歴史に関して言えば、Python の当初の意図を知っている人はい__slots__
ますか? 変数の作成を制限することは、悪用される機能またはバグですか? 人々は実際にどのように__slots__
使用されてきましたか? __setattr__
属性の作成を制限するためにオーバーロードされているのを多くの人が見たことがありますか? どれが一番いいですか?いずれかの方法に精通している場合は、知っている方法の長所と短所を自由に投稿してください. また、問題を解決する別の方法がある場合は、共有してください! (そして、そのマイナス面を繰り返さないようにしてください__slots__
他のスレッドで表現されています。)
編集:「なぜ?」の議論を避けたいと思っていましたが、最初の回答はこれが発生することを示しているので、ここに記載します。問題のプロジェクトでは、これらのクラスを使用して「構成情報」を保存し、ユーザーが (ユーザーの) パラメータを使用してオブジェクトに属性を設定し、オブジェクトをプログラムの別の部分に渡すことができるようにします。オブジェクトはパラメーターを格納するだけではないため、辞書は機能しません。ユーザーが誤って属性名を間違って入力し、プログラムが期待する属性の 1 つを設定するのではなく、新しい属性を作成してしまうという事例が既に発生しています。これは検出されないため、ユーザーはパラメーターを設定していると思いますが、期待される結果が表示されません。これはユーザーを混乱させ、見つけにくいものです。
EDIT 2, re pickling: これらのオブジェクトは、将来保存したいものになるでしょう。明らかに最善の解決策である場合__slots__
、おそらく別の保存方法を見つけることができますが、酸洗いは間違いなく価値があり、考慮に入れておく必要があります.
EDIT 3:メモリの節約は問題ではないことにも言及する必要があります。これらのオブジェクトはほとんど作成されないため、節約されるメモリはごくわずかです (3 ~ 12 GB のマシンで数十キロバイトのように)。
c++ - 他のクラスから「this->close()」を使用してQtウィンドウが閉じない
私の主な目標を説明することから始めます。私は(とりわけ)7つのボタンを備えたメインウィンドウを持っています。各ボタンを押すと、現在のウィンドウが閉じられ、新しいウィンドウが開きます。すべてのウィンドウに同じ 7 つのボタンがあるため、各ウィンドウ間を移動できます。すべてのウィンドウにまったく同じ 7 つのボタンがあるため、各クラスが呼び出して各ボタンをセットアップし、mainwindow.cpp の slot() に接続できる関数をセットアップしたいと考えました (以下の例では setupSubsystemButtons と呼ばれます)。ただし、標準の「this->close()」を使用してウィンドウを閉じることができないようです...メインウィンドウから別のウィンドウに移動すると機能します(メインウィンドウが閉じます)が、ホームウィンドウと言う別ウィンドウ、別ウィンドウが閉じません。提案をいただければ幸いです。
mainwindow.cpp(該当部分)
メインウィンドウ.h
ecsgeneralcommandWindow
ecsgeneralcommandWindow ヘッダー