問題タブ [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でオブジェクトをコピーするにはどうすればよいですか?
私は Qt を使用しており、いくつかの実際の基本的な問題があります。変数を持つ独自のウィジェット MyTest を作成しましたobj
。obj
変数が別のオブジェクトへのポインターだけでなくコピーされるように、ウィジェットの外部のオブジェクトからこの変数を設定する必要があります。エラー メッセージが表示され、この基本的な操作を行う方法がわかりません。これは私が使用しているコードです:
MyTest.h:
MyTest.cpp:
main.cpp:
c++ - QObjectのクローン作成
Qobjects は値ではなく ID であると想定されていることを知っています。たとえば、それらをコピーすることはできず、qt のドキュメントで説明されているように、デフォルトではコピー コンストラクターと割り当てが無効になっています。しかし、クローン メソッドを使用して、既存の QObject から新しい QObject を作成することは可能ですか? これは論理エラーでしょうか? 私が言うなら
また
clone メソッドはメンバーなどのものをコピーしますが、これは間違っていますか?
これでよければ、それを行う独自のコピー コンストラクターと代入演算子を作成できますか?
注: 実際には、qobject を継承するクラスでこれを試してみたいと思っています。
c++ - コピー コンストラクターを作成し、QObject サブクラスの代入演算子をオーバーロードできるのはなぜですか?
私は、QObject がコピー コンストラクターと代入演算子を無効にしたという印象を受けました...なぜ、これらの両方を含むこの QObject 派生物をコンパイルできるのでしょうか?
c++ - Q_OBJECT リンカ エラー!
アプリケーションをビルドすると、次のリンカー エラーが表示されます。
HIMyClass.obj:: エラー: 未解決の外部シンボル "パブリック: 仮想構造体 QMetaObject const * __thiscall CHIMyClass::metaObject(void)const " (?metaObject@CHIMyClass@@UBEPBUQMetaObject@@XZ) ファイルが見つかりません: HIMyClass.obj
HIMyClass.obj:: エラー: 未解決の外部シンボル "public: virtual void * __thiscall CHIMyClass::qt_metacast(char const *)" (?qt_metacast@CHIMyClass@@UAEPAXPBD@Z) ファイルが見つかりません: HIMyClass.obj
HIMyClass.obj:: エラー: 未解決の外部シンボル "public: virtual int __thiscall CHIMyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@CHIMyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z)ファイルが見つかりません: HIMyClass.obj
私のクラス宣言は次のようなものです
Q_OBJECT にコメントすると、リンカ エラーが発生します (明らかに、シグナルとスロットを使用できません)。Qt Creator を IDE として使用し、Qt 4.5.3 を使用しています。Rebuild Allを指定すると、 QMakeが呼び出されることは間違いありません。moc_* ファイルの生成に問題があると思います。Windows XP と cl をコンパイラとして使用しています。
このリンカ エラーの背後にある理由は何ですか?
c++ - QT: ドメイン オブジェクトを QObject に基づいて作成するのは良い考えですか?
私は、QT フレームワークを C++ と組み合わせて使用することにかなり慣れていません。私は疑問に思っていました: 私のドメインクラスを QObject に基づいたものにするのは良い考えですか? それとも、階層の上位のクラスに対してのみこれを行う必要がありますか? (ユーザー インターフェイス レベルに近い)。QTのドキュメントはこれについて明確ではありません:
QTのドキュメントから取得:
メタオブジェクト システムは、言語を真のコンポーネント GUI プログラミングにより適したものにする C++ 拡張機能です。
明らかに、適切に構造化された方法でアプリケーションを構築したいと考えています。ここ数日、私はこの質問に対する答えを見つけるために QT のドキュメントを閲覧してきました。私のアプリケーションが永遠にぐったりするような基本的な間違いを犯したくありません;-)。
QObject と Qt Object モデルの基本的なドキュメントは既に見てきました。私はまた、助けになったが実際には結論に達するのに役立たなかったフレッシュミートの記事を見つけました. 私を混乱させる他の何かは、すべての QT クラスが基本クラスとして QObject を使用するわけではないため、QT 自体がこの問題に関して一貫していないように見えることです。
QObject を基本クラスとして使用する利点は、次のとおりです。
- 階層
- シグナルとスロット
- プロパティ
- 保護されたポインターを使用できるようにする
- 国際化
ただし、ほとんどのドメイン クラスではこれらの機能は必要ありません。これに関するベスト プラクティス ルールはありますか? それとも、上記のポイントのいずれかが必要な場合に使用するというルールにする必要がありますか?
これをあまり混乱させないことを願っています:-)
qt - QObject以外の派生クラスは「常に」スタックに配置する必要がありますか?
Symbianの世界から来た私は、特に記述子を処理するときに、スタックスペースが不足しないように、可能な限りヒープを使用することに慣れています。CBase派生クラスは常にヒープに動的に割り当てられました。割り当てられていない場合、メンバー変数は初期化されないままになるためです。同じ規則がQObjectから派生したクラスにも適用されますか?
Qtでは、たとえばQStringをスタックに置くのが一般的であるようです。QStringがスタック上のコンテナーとして機能している間、文字列の内容はヒープに配置されますか、それともすべてがスタックに配置されますか?
c++ - Q_OBJECTマクロを配置した状態でこのコンパイル(リンク)を行わないのはなぜですか?
PyQtを使用してプロジェクトのプロトタイプを作成し、そこで機能させました。現在、C ++に変換しようとしていますが、問題が発生しています。
Q_OBJECTマクロを挿入しないと、コンパイルして機能しますが、コメントアウトすると、次のエラーが発生します。
ヘッダーは次のとおりです。
2番目の質問は、ここでQ_OBJECTマクロを省略した場合、悪いことが起こりますか?
はい、QGraphicsSceneを「ビュー」と呼ぶのはばかげていることを私は知っています。
visual-studio - cpp ファイルの Qt、CMake、Visual Studio、および Q_OBJECT
Qt 4.6、CMake 2.8、および Windows プラットフォーム用の Visual Studio 2008 を使用して大規模なプロジェクトを開発しています。
ビルド システムに関する限り、それはすべて標準的なものです。CMake のQT4_WRAP_CPP
マクロを使用してヘッダー ファイルから moc ファイルを生成し、add_executable
コマンドで最終的な実行可能ファイルにリンクします。すべてが期待どおりに機能しています。
このセットアップの唯一の制限は、.cpp ファイルで使用するウィジェットまたはヘルパーを定義できない Q_OBJECT
ことです。これは、使用されている場所のすぐ隣に表示される小さなコンテキスト固有のヘルパー クラスにとって非常に便利です。
ヘッダー ファイルだけでなく、ソース ファイルのリスト全体 ( .hと.cppの両方) をに渡そうとしましたが、うまくいきません (いくつかの moc 関連のシンボルが定義されていないため、リンクは失敗します)。QT4_WRAP_CPP
問題は、特定のファイルfoo.hとfoo.cppのペアに対して、QT4_WRAP_CPP
マクロが同じディレクトリに同じ moc ファイル ( moc_foo.cxx ) を生成することであり、明らかに最初のファイルがその結果、リンク時にシンボルが失われます。
その問題を修正または回避する方法はありますか? たとえば、次の形式のfoo.cppに特定のルールを追加しようとしました。
そして追加
foo.cppの最後に。これは機能するはずですが、悲しいことに、Visual Studio ではファイルごとに 1 つのビルド ルールしか許可されておらず、.cppファイルには既にビルド ルール (オブジェクト ファイルへのコンパイル) があるため、少なくとも Visual Studio ではこのアプローチは機能しません。
私が持っていた別のアイデアは、( share/cmake-2.8/Modules/Qt4Macros.cmakeで定義されているQT4_WRAP_CPP_WITH_PREFIX
) に基づいて、新しいマクロを作成することでした。これは、追加のプレフィックス引数を取り、このプレフィックスを生成された moc に追加します。ファイル。そうすれば、 .hファイルに対して 1 回、.cppファイルに対して 1 回、異なるプレフィックスを付けて2 回呼び出します。このアプローチについて私が嫌いなのは、パブリック API を使用する代わりに、CMake の Qt サポートの内部をいじることになることです。QT4_WRAP_CPP
QT4_WRAP_CPP_WITH_PREFIX
もっと良いアイデアはありますか?
チーズ、フランツ
c++ - Q_OBJECT はいつ使用する必要がありますか?
ドキュメントには次のように記載されています。
Q_OBJECT マクロは、独自のシグナルとスロットを宣言するか、Qt のメタオブジェクト システムによって提供される他のサービスを使用するクラス定義のプライベート セクションに表示する必要があります。
しかし、それは正確にはどういう意味ですか?どの QObject 派生クラスで安全に省略できますか? QObject 派生クラスで Q_OBJECT を省略し、そのクラスから継承すると問題が発生しますか? 基本的に、いつQtクラスから省略できるかについてもう少し情報が欲しいです。
c++ - Qt インターフェイスまたは抽象クラスと qobject_cast()
Java から書き直されたかなり複雑な C++ クラスのセットがあります。したがって、各クラスには単一の継承クラスがあり、1 つ以上の抽象クラス (またはインターフェイス) も実装します。
qobject_cast()
クラスからインターフェイスの 1 つに変換するために使用することは可能ですか? からすべてのインターフェイスを派生させるQObject
と、あいまいなQObject
参照が原因でエラーが発生します。ただし、 から継承した基本クラスしかない場合は、 sで動作するためQObject
使用できません。qobject_cast()
QObject
インターフェースによって参照されるプラグインと DLL の間でクラスを配置できるようにしたいと考えています。