2011-11-09 13 views
0

私は2つのウィジェットを持っている:のQt C++のアクセスプロパティ

class Widget: public QWidget 
{ 
    public: 
    Button* button; 
    Widget(); 
    int value; // need to get this var 
} 

Widget::Widget() 
{ 
    button = new Button(this); 
} 


class Button: public QPushButton 
{ 
    public: 
    Button(QWidget* parent = 0); 
} 

Button::Button(QWidget* parent) : QPushButton(parent) 
{ 
    this->parentWidget()->value // dont see var 
} 

どのように私は親ウィジェットからのプロパティを見ることができますか?これを行う最良の方法は何ですか?おかげ

+0

どのようなexacly参照してくださいと意味ですか?あなたのエディタ(intellisense)で - スクリーンに? – mbx

+0

不正確なことを申し訳ありません。私は変数 – Outsider

答えて

1

代わりのQWidgetのウィジェットを取ることができるあなたのボタンのコンストラクタ:

class Button: public QPushButton 
{ 
public: 
    Button(Widget* parent = 0); 
} 

Button::Button(Widget* parent) : QPushButton(parent) 
{ 
    parent->value = 0; 
} 
+0

にアクセスできることを意図していましたが、動作しません。 'class QWidget'には 'value'という名前のメンバーがありません。 – Outsider

+0

@Ramix:パラメータが 'QWidget * 'ではなく' Widget * '型であることに気がつきましたか? – Bill

0

は、次の2つの選択肢

の変更を持って

Button::Button(QWidget * parent) 
{ 
} 

Button::Button(Widget * parent) 
{ 
    //Here class type is already known 
    parent->value; 
} 
TO

それとも

あなたは、常にそうであることを行っていることを確認するために知っていれば、あなたのクラスにをキャストするコンストラクタ内はstatic_cast <ウィジェット*>(親)使用。そうしないとあなたがQ_OBJECTマクロを使用していることを確認してくださいのdynamic_cast <ウィジェット*>(親)

Button::Button(QWidget * parent) 
{ 
    Widget* wparent = static_cast<Widget*>(parent); 
    //now your can access wparent member variables 
} 
0

を使用しています。その後、property systemを使用できます。 QWidgetのメンバーに直接アクセスするためのものではありません。彼らはそのようにリンクすることすらできません - もちろんあなたのWidgetクラスを使用してボタンを強制することができますが、それは密接な結合につながります。

0

コンストラクタでのみ必要な場合は、それをパラメータとして渡すのはなぜですか?

コンストラクタ以外の場所に必要な場合は、この値が何をしているかを知ることが非常に役立ちます。それは外観を変えていますか?それは行動を変えていますか?あなたが親に直接アクセスできるようにするほとんどの方法があなたのウィジェットをその親に結びつけ、私にはそれを設計するより良い方法があるように思えるからです。

たとえば、valueが親で重要な変更を行った場合は、ボタンクラスのメソッドを呼び出して変更を通知します。そうすれば、適切なメソッドを呼び出す限り誰でもあなたのボタンクラスを使用できます。

私は型変換がトリックを行うだろうと思い
class Button: public QPushButton 
{ 
public: 
    Button(int value, QWidget* parent = 0); 

    void updateValue(int value); 
private: 
    int value; 
} 
0

Button::Button(QWidget* parent) 
{ 
    cout<<((Widget*)(this->parentWidget())->value; //print parent's value 
} 

しかし、あなたのコードのロジックは奇妙である:あなたがウィジェットのインスタンスを作成するときに、ボタンのコンストラクタが呼び出されます最初に、ウィジェットの値が取得されます。しかし、Widgetクラスはまだ構築されていないので、値は初期化されていません。

関連する問題