問題タブ [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.
xcode - XcodeでQ_OBJECTマクロを使用してヘッダーファイルをコンパイルするにはどうすればよいですか?
Qtフレームワークに対してリンクするC++プロジェクトをXcodeで作成します。helloworldプログラムはうまく機能します。QObjectから派生したクラスを追加してQ_OBJCETマクロを追加すると、リンクエラーが発生します。
クラスは
MyObject.h
MyObject.cpp
最初にmocを使用してMyObject.hをコンパイルし、生成されたmoc_MyObject.cppをXcodeプロジェクトに追加する必要があることはわかっています。
Microsoft Visual Studioでは、このヘッダーファイルをmocカスタムツールでコンパイルするように構成できます。そして、生成されたcppファイルをVSプロジェクトに追加します。
しかし、これはXcodeです。私の質問は次のとおりです。Q_OBJECTマクロを含むヘッダーファイルをコンパイルするための同等の手段がXcodeにありますか?
c++ - Qt:RemoveWidgetとオブジェクトの削除
私はQtのドキュメントを読み、qobjectツリーをいじっています。ツリー内からウィジェットを削除してメモリからウィジェットを削除する方法があるかどうか疑問に思いました。
qwidgets / qobjectsを相互に埋め込み、ツリーを作成する場合、removeWidgetを使用してウィジェットをqlayoutsから削除すると、GUIで視覚的に削除されますが、オブジェクトは親qobjectにアタッチされたままになります(object-> parent()は0ではありません)。親が削除された場合にのみ削除されます(スコープ外になるなど)。qwidgetを破棄できるのは、アプリケーションが終了したときにのみ、最上位のウィジェットがその下にあるすべてのものを処理する場合(または、オブジェクトがスコープ外になった場合)にのみわかります。
たとえば、2つのステージがあるメインウィンドウがあるとします。最初のウィンドウには一方の親から約100個のオブジェクトが埋め込まれ、もう一方のウィンドウには200個のオブジェクトが埋め込まれています。アプリケーションはステージ1から始まり、ステージ2に移動し、ステージ1に戻ることはありません。 。これをある程度効率的にしたい場合は、ステージ1のすべてのオブジェクト(100個のオブジェクト)を強制終了しようとしますが、メインウィンドウのルートノードに接続されているため、「removeWidget」を使用しても破棄できません。
また、「new」演算子なしで作成されたウィジェットのポインターを受け取ろうとしましたが、そのオブジェクトを削除すると、デストラクタが2回呼び出されるため、アプリケーションがクラッシュしました。
私の質問は、qobjectツリー内のノードを削除する方法はありますか(そのノードはスコープ外であるため、またはアプリケーションが終了したときに削除されません)?
これがあまり意味をなさない場合は申し訳ありません。前もって感謝します。
編集:
間違った考えをしてしまったらごめんなさい。私の質問は、アプリケーションが終了する前、またはオブジェクトがスコープ外になる前に、メモリからノードを削除することです。これは例です(おそらくそれほど良くはありません)。
qt - 生成されたmoc名が正しくありません
私はcmakeを使用するQtベースのプロジェクトに取り組んでいます。生成されたすべてのmocファイルには名前が付けられていますが、生成されたmocファイルに。ではなく*.moc
名前が付けられているファイルがいくつかあります。これが発生する理由と、これらのファイルを修正する方法。moc_*.cpp
*.moc
編集:
これらのクラスはQObjectを継承しており、Q_OBJECTマクロとQ_DECLARE_PUBLICマクロがあり、.mocがない限り、コンパイルされません。
.cppファイルに.mocファイルを含める必要があります。
-.mocを生成する同一のクラス(私のクラスと同一の実装)がありますが、私のクラスはmoc_*。cppを生成することに夢中になります。
c++ - Qt: Q_OBJECT の enum の meta.enumeratorCount() によるメタデータがありません。なぜですか?
のメタデータを取得しようとする次のクラスがありenum MyEnum
ます。ただし、そのカウントをループするmeta.enumeratorCount()
と常に0になります。基本的に、この例hereに従っていました。問題を見つけるために、私はメソッドでも同じことを試みていました.同じ問題-メソッドカウント0.コードはコンパイルされ、エラーも警告もありません.
ばかげた間違いに違いない....多分あなたは私を助けることができます
enums - Qt メタデータで使用する Qt-fy 既存の列挙型
既存の があり、それを/enum X { A, B }
などの Qt メタデータで使用したいとします。QMetaObject
QMetaEnum
enum
クラス内でmy を定義すれば、すべて問題ありません。つまり、メタデータ システムでQ_OBJECT
取得できます。しかし、メタデータ システムを利用できるようにするにはどうすればよいでしょうか。MyEnum
X
- これは次のフォローアップです: Qt: Q_OBJECT の enum の meta.enumeratorCount() によるメタデータがありません。なぜですか?
- 動機: real
enum X
には多くの例外コードが含まれており、メタデータ システムを使用して元の説明テキストを取得したいと考えています。オリジナルenum
は(!)ではありませんQ_OBJECT
。
qt - Qt - Q_OBJECT とマクロ
では、がマクロQt
であることがわかっています。この文脈でマクロとはどういう意味ですか? 特に、マクロという用語にはいくつかの異なる定義があることに気付きました。Q_OBJECT
ありがとう。
c++ - QObjectは、削除時にスタックとヒープに割り当てられた子を区別しますか?
Qtのドキュメントによると:
QObjectは、オブジェクトツリーに編成されます。別のオブジェクトを親としてQObjectを作成すると、そのオブジェクトは自動的に親のchildren()リストに追加されます。親がオブジェクトの所有権を取得します。つまり、デストラクタ内の子を自動的に削除します。
私にとっては、QObjectが削除されるときに、子リストに格納されているすべてのポインターを通過してdeleteを呼び出すことを意味します。
ただし、子を動的に割り当てる必要はなく、スタックに割り当てられたオブジェクトを使用してQObjectツリーを構築することは完全に合法です。
標準仕様によれば、動的に割り当てられたオブジェクトを指さないポインタでdeleteを呼び出すことは未定義の動作であり、「何もない」からプログラムのクラッシュに至る可能性があります。
IMOは、QtクラスのほぼすべてのコレクションのバックボーンであるQObjectが、未定義の動作を生成する可能性のあるものに依存する可能性はほとんどありません。
では、QObjectは、削除時にスタックとヒープに割り当てられた子を区別しますか?もしそうなら、どのくらい正確に?
c++ - QSharedPointer と QObject::deleteLater
QSharedPointer
管理対象オブジェクトがその目的を終了し、すぐに削除の準備ができていることを通知する状況があります (実行後、readyForDeletion
シグナルを発する関数を離れた後)。通常のポインターを操作するときQObject::deleteLater
は、オブジェクトを呼び出すだけですが、QSharedPointer
マネージド インスタンスではこれができません。私の回避策は次のとおりです。
これはうまく機能しますが、この方法を使用すると多くのオーバーヘッドが生じます (新しいものを割り当てるQObject
など)。このような状況を処理するためのより良い解決策はありますか?
qt - Qtでクラスをスクリプト可能かつシリアライズ可能にする方法は?
2 つの基本的な特性を持つクラスを作成しようとしています。
Q_INVOKABLE
スクリプト可能である必要があります。クラスには、スクリプトに公開される、修飾された多数のプロパティとメソッドが含まれています。qRegisterMetaTypeStreamOperators()
sに格納するために登録できるように、シリアライズ可能である必要がありますQVariant
。
私が知る限りQObject
、クラスをスクリプト可能にするには、から派生させる必要があります。ただし、クラスを に登録するには、クラスqRegisterMetaTypeStreamOperators()
にデフォルトのコピー コンストラクターが必要なようです。これは、QObject
派生クラスにはないものです。
両方の目標を達成する方法はありますか?