4

Qt を学んで以来、私が読んだドキュメンテーションや本では、ウィジェットなどの QObject サブクラスのインスタンスである属性にポインターを使用しているという事実に混乱しています。

QObjects が子を削除することは知っていますが、本当に必要な場合を除いてポインターの使用を避けるべきではありませんか?

これは、ポインターを使用しない実際の例です。

Widget.h ファイル:

#include <QSlider>
#include <QLabel>
#include <QVBoxLayout>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);

public slots:
    void change(int);
private:
    QSlider m_slider;
    QLabel m_label;
    QVBoxLayout m_layout;
};

および Widget.cpp ファイル:

#include "Widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , m_slider(Qt::Horizontal)
    , m_label("0")
    , m_layout(this)
{
    m_layout.addWidget(&m_slider);
    m_layout.addWidget(&m_label);

    connect(&m_slider, SIGNAL(valueChanged(int)), this, SLOT(change(int)));
}

void Widget::change(int n){
    m_label.setText(QString::number(n));
}

ここでの唯一の違いは、ヘッダーを Widget.h ファイルに含める必要があることです。それがポインターを使用する理由でしょうか?

また、StackOverflow で同様の質問を見たことがあることを付け加えたいと思いますが、その答えは、ウィジェットは関数呼び出しの間に存在する必要があるというものでしたが、ウィジェットを属性として使用すると、ここで達成されます。

4

2 に答える 2

5

ここで、これと同じ質問についてかなり長い議論があるようです。
クラスメンバー:ポインターまたは変数?

このリンクからのいくつかのポイントは、次のことについて話します。

  • 寿命の長いオブジェクトと寿命の短いオブジェクト
  • ヒープとスタック
  • オブジェクトに設定された親に基づくデストラクタの保証された順序

ここでのポイントは、厳格なルールではなく、ケースバイケースであるようです。私は現在、PyQt->Qtから移行してC++を取得しているので、これまでのところ、QObjectサブクラスであるクラスメンバーには常にポインターを使用するという意見が限られています。Qtの親->子の破壊プロセスによってのみ破壊されることを私は知っているような気がします。

繰り返しますが、これは限られた視点です。C ++の経験が豊富な人なら、もっと良い答えが得られると思います。しかし、私が参照したリンクには、非常に経験豊富なQtプログラマーが含まれています。

于 2013-01-02T19:14:53.003 に答える
0

たぶん、デフォルトのコンストラクターとは異なるコンストラクターを使用するだけですか?

于 2013-01-02T18:58:09.987 に答える