問題タブ [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.
c++ - Qtインターフェイスクラス
次のようなインターフェイスクラスを作成するにはどうすればよいですか?
および派生クラス
このクラスから継承すると、あいまいな変換について言及するエラーが発生します。これがコンパイラの正しい動作であることは理解していますが、将来のクラスのインターフェイススロットを取得するにはどうすればよいですか?たぶん私はQ_DECLARE_INTERFACE
マクロを使わなければなりませんか?
c++ - QObjectから派生したクラスのコンストラクターがスローした場合、destroyed()が発行されますか?
私はあちこちで次のようなQtGUI構文を見てきました:
私がボタンの親として与えている「これ」とレイアウトが完全に構築されていないため、子を破壊しない可能性があるため、例外が発生した場合にこれがリークする可能性があるかどうかを常に考えていました。
MSVC2010 Qt4.8.3で試してみましたが、基本QObjectクラスが完全に作成されると(もちろん最初に実行されます)、コンストラクター内の他のオブジェクトに「this」を渡しても問題ないようです。オブジェクトは破棄されます。正しく。
Qtのドキュメントでこれを保証する場所は見つかりませんでしたが、誰かが私にそれを指摘してくれるので、これが将来変更されないことを保証できますか?
c++ - マクロとインクルードでの QObject エラー
プログラムでシグナルとスロットを使用したいので、Ineed に以下のように Q_OBJECT を追加するように指示されました。
さて、私はクラスを持っています:
これにより、「Q_OBJECT はタイプに名前を付けていません」というエラーが発生します。#include を追加すると、「A の vtable への未定義の参照」というエラーが表示されます
それで、これを行う正しい方法は何ですか?
c++ - Qt でカスタム クラスをシリアル化する
QObjects の読み取り/書き込みを使用 していますが、それは本当ですか? クラスをシリアル化しますが、逆シリアル化すると元のクラスではありません!
私に何ができる?
これは私の基本クラスのヘッダーです:
および .cpp は次のとおりです。
そして私は base から継承する学生クラスを持っています:
そしてそれは私のメインです:
それは私の出力です:
c++ - 2 つの QObject の割り当て
「mamad」と「student」の 2 つのクラス名があり、どちらも「Base」が QObject から継承するクラス「Base」から継承されます
Student Classには、mamadである「subject」というフィールドがあり、newsubjectを取得してnewsubjectをsubjectにコピーする関数(setsubject)があります。
しかし、私はエラーがあります:
どうすれば修正できますか?
これは私のママクラスです:
それは私の学生クラスです:
getsubject 関数にもこの問題があり、修正方法がわかりません。
お願い、お願い、助けて
c++ - QObject 属性へのポインターの使用
Qt を学んで以来、私が読んだドキュメンテーションや本では、ウィジェットなどの QObject サブクラスのインスタンスである属性にポインターを使用しているという事実に混乱しています。
QObjects が子を削除することは知っていますが、本当に必要な場合を除いてポインターの使用を避けるべきではありませんか?
これは、ポインターを使用しない実際の例です。
Widget.h ファイル:
および Widget.cpp ファイル:
ここでの唯一の違いは、ヘッダーを Widget.h ファイルに含める必要があることです。それがポインターを使用する理由でしょうか?
また、StackOverflow で同様の質問を見たことがあることを付け加えたいと思いますが、その答えは、ウィジェットは関数呼び出しの間に存在する必要があるというものでしたが、ウィジェットを属性として使用すると、ここで達成されます。
c++ - 未解決の外部シンボル "パブリック: 仮想構造体 QMetaObject const * __thiscall 親
QObject からクラスを継承しました:
しかし、私が書くとき:
次のエラーが表示されます。
qt - javascriptにシグナルの再評価を強制しますか?
だから私は次のケースがあります:
QML ファイル:
JavaScript ファイル ( Script.js ) :
getSource を再評価する必要があることに基づいて、SomeQtObject にいくつかのシグナルがあるとします。これらのシグナルが発行されるたびに再評価されるように、これらのシグナルを javaScript getSource 関数にバインドするにはどうすればよいですか?
c++ - 含まれているオブジェクトも継承する場合、相互に継承するコンテナーを定義するにはどうすればよいですか? (ベースとして QObject を使用)
バックグラウンド:
ObjectListModel
を継承QAbstractListModel
して含むクラスを呼び出していQObjectList
ます。オブジェクトは行で、そのプロパティは列 ( を使用して設定QMetaObject
) であり、通知の変更はビューに伝達されます。また、いくつかのコンテナ ヘルパー (begin/end/iterator/size) もあるので、格納されている QObject を反復処理できます。- タイプセーフを提供するも持っています (主にet.al. を
TypedObjectListModel<T>
オーバーライドし、Tに対して行う新しいタイプを定義することによって)。push_back
iterator
static_cast
オブジェクトのタイプが 1 つしかない場合、これはすべて非常にうまく機能します。新しいクラスを作成するだけです (f.ex.FruitsModel
が含まれQ_OBJECT
、継承しTypedObjectListModel<Fruit>
ます。これには、Fruits または Fruit-subobjects のみを含めることができます。
ただし、2 つの異なる状態で実行できるアプリがあります。2 番目の状態では、モデルはリンゴのみを保持し、バナナ (具体的な基底クラスである果物) は保持しません。
ApplesModel
したがって、T の型を継承して変更する必要がある型を作成したいと思います。継承ダイヤモンドOF DEATHFruitsModel
を取得するため、これにより問題が発生します。
FruitsModel::push_back(Fruit*) は ApplesModel では違法であるため、これも概念的に間違っています。ただし、果物 (リンゴだけでなく) の読み取り/反復は可能である必要があります。
また、FruitsModel ( findFruitById
) には、オーバーライドして ApplesModel でのみ Apple を返す必要がある関数がいくつかあります。
C++ でこの問題を解決する際に推奨される設計パターンは何ですか?
似たようなことを試みたのは私が初めてではないと思います (希望します)。
私は多くのアイデアを試しましたが、さまざまな行き止まりに行き詰まっています。ObjectListModel の仮想継承が問題を解決すると思うかもしれませんが、私はこれを使用して取得しQObject::findChild
ます:
上記は、代わりに dynamic_cast を使用して、findChild の独自の実装で修正できますが、まだいくつかの行き止まりがあります。
アップデート
geekp には次の提案がありました。
Fruit から Apple を継承し、ApplesModel を気にしない
FruitsModel にリンゴだけが含まれるようにするにはどうすればよいでしょうか。また、リンゴを (フルーツとして) フェッチするたびにダウンキャストする必要があります。
FruitsModel から継承しないでください (そのメソッドを使用していないのに、なぜ継承するのでしょうか?)
私はいくつかの方法を使用していますが、特に読書用のものです。
Apple の TypesObjectListModel から継承せず、FruitsModel のみをサブクラス化します。
AppleModel を気にしないのと同じ欠点。
c++ - QObjectのサブリングにreinterpret_cast
ある種のオブジェクトファクトリ(テンプレートベース)があり、それは私の目的にはかなりうまく機能します。しかし今、私はQObjectと純粋な抽象クラス(インターフェース)の両方から派生したクラスを操作しようとしましたが、奇妙な実行時エラーが発生しました。
ここにこのクラスの簡単な図(派生)
およびderived.cppでのその実装:
voidポインターをインターフェースにキャストしようとすると、予期しない(私にとっては)動作が発生します。これは、実行時エラー、またはその他のメソッド呼び出し(クラスのサイズによって異なります)である可能性があります。
voidポインタをインターフェイスにキャストできない理由を教えてください。そして、回避策はありますか?
ご回答ありがとうございます