Невозможно получить доступ к переменным QMainWindow из дочернего класса - PullRequest
0 голосов
/ 08 февраля 2012

Я пытаюсь установить переменную, к которой могут обращаться несколько дочерних элементов на уровне 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 ]

2 голосов
/ 08 февраля 2012

Просто передайте * 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 голос
/ 08 февраля 2012

Вы можете использовать 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;
}
...