2011-11-09 35 views
0

我有兩個部件: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

你的意思是什麼可以看到?在你的編輯器(智能感知) - 在屏幕上? – mbx

+0

抱歉不準確。我的意思是可以訪問變量 – Outsider

回答

1

您的按鈕構造可以採取的,而不是一個QWidget一個Widget:

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:您是否注意到該參數的類型是'Widget *',而不是'QWidget *'? – Bill

0

你有兩個選擇

變化

Button::Button(QWidget * parent) 
{ 
} 

TO

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

或者

使用的static_cast <的Widget *>(父)在構造函數中投到類,如果你肯定知道它始終將是如此。否則,使用dynamic_cast的<的Widget *>(父)

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

確保您使用Q_OBJECT宏。然後你可以使用property system。它不打算直接訪問QWidget的成員。他們甚至不能以這種方式連接 - 當然你可以強制你的按鈕使用(只)你的Widget類,但這會導致緊耦合。

0

如果只是在構造函數中需要它,爲什麼不把它作爲參數傳遞呢?

class Button: public QPushButton 
{ 
public: 
    Button(int value, QWidget* parent = 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實例,Button的構造函數將被調用首先,檢索Widget的值。但是,Widget類尚未構建,因此值未初始化。