我正在尝试设置一个可以在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公开并直接访问它等等。任何想法我需要做什么?
答案 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;
}