次のコードを見てください。
QStackedLayout stackLayout(this);
QStackedLayout stackLayout = QStackedLayout(this);
質問が 2 つあります。
なぜ 2 番目のステートメントが不可能なのですか?
QStackedLayout のコンストラクターをポインターとしてではなくヘッダー ファイルで宣言する場合、どのように呼び出すことができますか?
まず、コンストラクターを誤解していると思います。Qt は要素の親を受け取ります。これは、ヒープ上に作成されたときに要素の保存期間を管理するためです。
// here you need this constructor, so Qt will free the resource for you
QStackedLayout * layout = new QStackedLayout(this);
// here you don't need it, the object has automatic storage duration
QStackedLayout layout;
次に、ヘッダー ファイルで宣言されたオブジェクトに対して特定のコンストラクターを呼び出したい場合は、初期化リストを使用します。
struct foo
{
foo()
: s("demo")
{}
std::string s;
};
オブジェクトは派生QObject
元であるため、コピーできません。そのため、2 番目のステートメントは機能しません。
stackLayout をポインタとして定義する必要があります
QStackedLayout* stackLayout = new QStackedLayout(this);
最初の質問は簡単です。QStackedayout は QObject を継承しています。QObject をコピーしたり割り当てたりすることはできません。
2 番目の質問は、QStackedLayout のコンストラクターを呼び出すことです。しかし、.h ファイルでこれを行う方法を本当に知りたいと思いますか? デフォルトのコンストラクターのみが可能です。この場合、ポインターは問題ありません。または、.h ファイルに入れQStackedLayout layout
て、コンストラクターに layout.setParent(this) のようなものを追加します。私はこれをしたことがありません。私には奇妙に見えます。なのでデメリットがあるかどうかはわかりません。
編集:うーん...赤面...「唯一のデフォルトコンストラクタ」はもちろんナンセンスです。場合によっては、1、2 秒長く考えるのが得策です。特に、自分自身がめったに使用しない構成について。:-)