問題タブ [qobject]
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.
qt - Qt:信号が接続されたときに通知を受け取ります
信号がスロットに接続されているという通知を受け取ることはできますか?
たとえば、クラスFooがあります。
そしてどこかで、誰かがそれを接続します:
connect()が呼び出されたときにコードを呼び出したいので、サーバーにFooを登録して、信号を発信するネットワークイベントを受信できます。このように、信号を接続するだけで、送信者はサーバーに自動的に登録して必要なイベントを受信します。これにより、手動登録が必要になるよりもエラーが発生しにくくなります。たとえば、connect()を再実装できます。
残念ながら、静的QObject :: connect()が使用されている場合は機能しません。または、QObject :: metaObject()を再実装して、indexOfSignal()が再実装されたカスタムQMetaObjectサブクラスを返すこともできますが、これも不可能であり、indexOfSignal()も仮想ではありません。
何か案は?ありがとう。
c++ - QObject::deleteLater() を取得してオブジェクトをゼロにするにはどうすればよいですか?
通常、オブジェクトを削除するときは、ゼロに設定します。これは、ルーチンをコーディングして、オブジェクトがゼロでないことを確認してから続行するのに役立ちます。
ただし、deleteLater()
関数を使用すると、制御できなくなります。有効なアイテムなのか、新しいアイテムを作成する必要があるのかわかりません。私が見つけた解決策は、状態を個別に追跡することでしたが、より良い方法はありますか?
c++ - Qt: 子オブジェクトを親オブジェクトで構成できますか?
Qt では、コンポジションを介して親に子ウィジェットを埋め込むことができますか、それとも で作成する必要がありnew
ますか?
QObject
ドキュメントによると、親が破棄されると、から派生したオブジェクトは自動的に破棄されます。これdelete
は、上記の例ではクラッシュする への呼び出しを意味します。
以下を使用する必要がありますか?
編集
答えは非常に多様で、基本的に 3 つの可能性に要約できます。
- はい、構成は問題ありません。Qt は、オブジェクトがどのように割り当てられ、ヒープに割り当てられたオブジェクトのみを把握でき
delete
ます (これはどのように機能しますか?) - はい、構成は問題ありませんが、親を指定しないでください。そうしないと、親が
delete
オブジェクトを呼び出すためです (しかし、親のないウィジェットはトップレベル ウィンドウに変わりませんか?) - いいえ、ウィジェットは常にヒープを割り当てる必要があります。
どちらが正しいですか?
c++ - C++0x列挙型クラスのQtサポート
Q_ENUMSを使用enum
して、から継承するクラス内で宣言されたQt に「登録」できるようになりましたQObject
。これにより、 のいくつかのクールな反射機能が得られますenum
。
enum class
また、C++0x で導入されたタイプ セーフも非常に気に入っています。Qt 開発者によるenum class
.
この質問は、一般的な C++0x 機能の Qt サポートについて漠然と尋ねています。について具体的に質問していenum class
ます。Qt はクロスプラットフォームであり、多くのコンパイラをサポートしているため、C++0x のサポートはロールアウトが遅くなりますがenum class
、コア言語の非常に優れたシンプルな改善です!
c++ - コピーと割り当てによる C++ Qt リフレクション
ドキュメントや他のQObject
多くの人が説明しているように、 aはQObject
アイデンティティを持っているため、コピーコンストラクタと代入演算子を隠しています。
QObject
ただし、動的プロパティ機能またはシグナル/スロット機能から派生したものではありません。リフレクション、または にアクセスする機能のみが必要ですFoo::staticMetaObject
。
私はそれからコピーできませんFoo
:
この場合、コピーと割り当てを許可する最善の方法は何ですか? コピー コンストラクターと代入演算子を必ず記述する必要がありますか? 彼らはどのように見えるでしょうか?リフレクションは機能しますか?
c++ - コピーコンストラクタなしのC++代入演算子
質問:コピーコンストラクターではなく、代入演算子を定義できますか?内部クラス(APIで公開されていない)の場合、これはまだ悪い設計手法ですか?
私がそれを必要とする理由:この質問が述べているようにQObject
、そのコピーコンストラクターと代入演算子をプライベートにして、サブクラスがどちらかを使用しようとすると、コンパイル時にエラーが発行されるようにします。
ただし、「値」(ドキュメントで説明されてQobject
いる「ID」ではない)をコピーするには、代入演算子を定義する必要があります。このクラスのコピーコンストラクターはどこにも使用していません。
コピーコンストラクターを作成したくない理由は、とにかく使用しないコードを複製するためです。
c++ - C++ での QObject 多重継承とポリシー/特性設計の問題
私は余暇にかなり大きなプラグイン駆動のアプリを構築していますが、ショーストップの設計上の欠陥に遭遇しました。私のアプリはポリシー/特性ベースの設計を使用していますが、Qt を使用しているため、(テンプレートと MI ではなく) MI のみを使用して実行されます。これらのクラスには、純粋な仮想クラスもあれば、エンド ユーザーが触れてはならない内部でかなり重要な機能を実行するものもあります。
私の問題は、これらのクラスの一部がシグナル/スロットを必要とするため、QObject から派生することです。問題なく、仮想的に継承することができます。しかし、私が抱えている問題は、Qt クラスから派生させ、それを 1 つ以上の特性で拡張したい場合です。
ここで QGLWidget は QObject から派生していますが、事実上ではなく、あいまいさの問題を引き起こしています。
Sy_saveable
たとえば、純粋な仮想を作成し、Sy_saveable_imp
そこから実際の実装を含む を派生させる Bridge パターンを検討しました。次に、それSy_abstractGLViewport
を集約経由で使用します。
アプリはプラグインベースであるため、これはかなり専門的ではないように思えます。将来のプラグイン作成者がすべてのインターフェースメソッドを集約されたインスタンスに「接続」するのは少し残念です。エンドユーザーがメソッドをオーバーライドしたい場合があるため、マクロを使用して自動化することさえできません。
この問題を解決するパターンはありますか? または、MI を必要としないが、同じ柔軟性を提供するパターンですか? これは私の個人的な趣味のプロジェクトです。多くのリファクタリングを行ってもかまいません。正しくやりたいと思っています。
qt - ベースクラスでSignalを宣言できません
クラスBとクラスCの親であるクラスAがあります。クラスBとクラスCで宣言されて使用されているシグナルがあります。しかし、クラスAで他のシグナルを書き込もうとすると、vtable参照エラーが発生します。Q_OBJECTマクロを.hファイルに書き込めないため、エラーが発生します。
qt - Qt:QtScriptアクセス用のポインターと前方宣言を含むQ_PROPERTY
問題
Q_OBJECTとQ_PROPERTYを使用して、スクリプトからいくつかのオブジェクトにアクセスするプロジェクトを作成しています。私には2つの問題があります:
- 前方宣言を使用するクラスをスクリプト可能にする
- プロパティをポインタとして返す
説明
1.なぜ前方宣言?
Aはテンプレートのためにヘッダーに完全なBタイプを必要とするため、クラスBはAへの前方宣言を取得します。Bはヘッダーに不完全な型(A *)のみを必要とするため、前方宣言は有効です。
2.なぜポインタを返すのですか?
スクリプト内の実際のオブジェクトにアクセスする必要があるため、コピーを返すことはできません。Qtはスロットが参照を返すことを許可しないため、参照を返すことはできません。それらのタイプは無視され、void*のみを返します。
コード
ペーストビンまたはZIPアーカイブとして、または最小限の例のZIPアーカイブとして、テスト/再生用の完全なコードダウンロードが利用可能です。前方宣言とMOCのためにファイルを分割する必要がありました。テストするためにMakefileを追加しました。depsを作成します:g ++、moc、Qt。
重要な部分
スクリプトのエラー行:
コンパイルエラー
上記のQ_PROPERTYをコメントアウトすると、このエラーは消えます。
スクリプト例外
Q_PROPERTYを省略し、スクリプトからスロットとしてGetA()メソッドを呼び出すと、次の例外が発生します。
これでA*を登録すると、次のqRegisterMetaType<A*>("A*");
ように変更されます。
これは、GetA()がAオブジェクトを返さないか、何らかの方法でポインターを返すことを示していますが、スクリプトはそれを逆参照できません。GetA()は実際にを返しますがQVariant(A*)
、これはどういうわけか使用できますか?
質問:
- どういうわけか不完全な型からQ_PROPERTYを作成できますか、または前方宣言を回避するにはどうすればよいですか?
- スロットで参照を返すことはできますか(たとえば、ポインタをラップし、
operator.
類似したものが存在する場合はスクリプトを「オーバーライド」するクラスなど、いくつかのトリック)または - QtScriptでQVariant(A *)をAに逆参照することはできますか?
qt - 複数のウィジェットで同じ QPushButton を表示する
2 つのウィジェット (Real と Fake) があり、そのうちの 1 つに QPushButton があります。今、同じボタンを他のウィジェットに表示したいと思います。どうすればいいのですか?
コピーを作成したくありません。親を変更せずに、同じ QObject を別のウィジェットに同時に表示したいのです。
例として、次の例では、「mybutton」を両方のウィジェットに同時に表示したいと考えています。
これが必要な理由は、多数の MDISubWindows があり、それらにいくつかのコントロール (ボタン、チェックボックスなど) が含まれているためです。ここで、これらのウィジェットからこれらのコントロールのいくつかを選択して、単一のウィジェットを作成したいと考えています。これを行っている理由は、ボタンを 1 つだけ使用しているときに MDISubwindow のすべてを表示したくないためです。提案は本当に役に立ちます。ありがとうございました。
-履歴書