2012-02-08 12 views
0

MainWindow(QMainWindow)レベルで複数の子からアクセスできる変数を設定しようとしています。問題は、子供(または孫)からアクセスしようとするたびに、私はセグメンテーション違反を取得します。ここで子クラスのQMainWindow変数にアクセスできない

は関与コードのモックアップだ:

//MainWindow.h 
... 
public: 
    int getVariable(); 
    void setVariable(int i); 
... 
private: 
    int globalInt; 
    SomeWidget *myWidget; 


//MainWindow.cpp 
MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ... 
    this->globalInt = 10; 
    myWidget = new SomeWidget(); 
    myWidget->setParent(this); 
    .... 
} 
int getVariable() 
{ 
    return this->globalInt; 
} 
void setVariable(int i) 
{ 
    this->globalInt = i; 
} 
... 



//SomeWidget.cpp 
... 
int x = (static_cast<MainWindow*>(this->parent()))->getVariable(); //Causes Segfault 
... 

私は正直に私が間違ってやっている見当がつかない。私は親に新しいMainWindow *ポインタを作成してキャストしようとしましたが、 "global" intをpublicにして直接アクセスするなどの試みをしました。

+2

に試してみてください[qobject_cast](http://developer.qt.nokia.com/doc/qt-4.8/qobject.html#qobject_cast)を使用し、 'qDebug()<< this-> parent()'を試してください。それは何が起こったのか理解するのに役立ちます。 – graphite

+0

コードの最後の行はどこですか?親はそれが設定されていないので、それは俳優でクラッシュします。私はそのようなあなたの親にアクセスすることをお勧めし、その代わりに親ウィジェットがその値を子に渡すようにします。 –

+0

最後の行がコードのさらに下にあります。私は親が設定されていることを確認しました - 新しいSomeWidget(これ)。 – giraffee

答えて

1

reinterpret_castを使用できます。 ポインタが互換性のないクラスのオブジェクトを指しているため、逆参照が安全でないため、これは安全な方法ではないことに注意してください。Info

私はちょうど仕事に着いたので、ちょっとした(そして醜い)例、小さなコンソールプログラムのための時間がありました。

myWidget = new SomeWidget(this); 

を、後でSomeWidgetの実装よりも、あなたは道以下のメインウィンドウのメンバーにアクセスすることができます:

class some_widget 
{ 
public: 
    some_widget(){ m_parent = 0;} 

    void set_parent(void* p_parent){m_parent= p_parent;} 
    void* get_parent(){return m_parent;} 

    void do_something(); 

private: 
    void* m_parent; 
}; 

class main_window 
{ 
public: 
    main_window(void); 
    ~main_window(void){ delete myWidget; myWidget = 0;} 

    int getVariable(){return global_int;} 
    void setVariable(int i){global_int = i;} 

    some_widget* get_widget(){return myWidget;} 

private: 
    int global_int; 
    some_widget *myWidget; 
}; 

main_window::main_window(void) 
{ 
    global_int = 10; 
    myWidget = new some_widget(); 
    myWidget->set_parent(this); 
} 

void some_widget::do_something() 
{ 
    if(this->get_parent() != 0) 
    { 
     int x = reinterpret_cast<main_window*>(this->get_parent())->getVariable(); 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    main_window* mw = new main_window(); 

    mw->get_widget()->do_something(); 

    return 0; 
} 
+0

私が疲れているときはどうやらコード化できません。私は実際にMainWindowにいた2人の親でした。reinterpret_cast (this-> parent() - > parent() - > parent() - > parent() - >変数)がトリックを行いました。 – giraffee

2

単にコンストラクタパラメータとしてSomeWidgetに*これを渡し

void SomeWidget::someFunc() { 
    MainWindow *w = qobject_cast<MainWindow*>(parent()); 
    //cphecing the pointer 
    if(w != 0) { 
     //accessing MainWindow functionality 
     int myInt = w->globalInt; 
    } 
+0

dynamic_cast(static_cast)の代わりにqpbject_castを使ってもこれを試しましたが、globalIntを取得しようとするとsegfaultが発生します。 – giraffee

関連する問題