2012-02-08 4 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을 public으로 만들고 직접 접근하는 등의 시도를 해왔다.

+2

에 시도 [qobject_cast] (http://developer.qt.nokia.com/doc/qt-4.8/qobject.html#qobject_cast)를 사용하고'qDebug() << this-> parent()'를 시도하십시오. 그것은 무슨 일이 일어 났는지 알아내는 데 도움이 될 것입니다. – graphite

+0

코드에서 마지막 줄은 어디입니까? 부모님이 설정하지 않으므로 배우가 추락합니다. 나는 그런 식으로 부모님을 만날 것을 권한다. 대신 부모 위젯이 그 값을 자식에게 넘겨 주도록 권한다. –

+0

마지막 줄이 코드에서 더 아래에 있습니다. 나는 부모가 설정되었는지 확인했다 - 새로운 SomeWidget (this). – giraffee

답변

1

reinterpret_cast을 사용할 수 있습니다. 이것은 호환되지 않는 클래스의 객체를 가리키는 포인터 을 만들 수 있기 때문에 안전한 방법은 아니므로 역 참조 해제는 안전하지 않습니다. (Info)

방금 ​​직장에 도착하여 작은 콘솔 프로그램 인 약간의 (그리고 못생긴) 예를 들었습니다.

myWidget = new SomeWidget(this); 

을 그리고 나중에 SomeWidget의 구현보다 당신은 방법 다음 MainWindow를 회원에 액세스 할 수 있습니다 :

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에 실제로있는 두 명의 부모였습니다. 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

관련 문제