无法从子类访问QMainWindow变量

时间:2012-02-08 05:29:22

标签: c++ qt segmentation-fault parent global

我正在尝试设置一个可以在MainWindow(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 *指向父项并指向它的指针,我已经尝试将“全局”int公开并直接访问它等等。任何想法我需要做什么?

2 个答案:

答案 0 :(得分:2)

只需将* this传递给SomeWidget作为构造函数参数:

myWidget = new SomeWidget(this);

然后,在SomeWidget的实施中,您可以按照以下方式访问MainWindow的成员:

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

答案 1 :(得分:1)

您可以使用reinterpret_cast。请注意,这不是一种安全的方法,因为您可以使指针“指向不兼容类的对象,因此取消引用它是不安全的。”Info

我刚刚上班,所以我只有时间去做一个小巧(丑陋)的例子,一个小型的控制台程序。

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;
}