我正在使用Qt和C ++,点击菜单项后出现第二个窗口,点击第二个菜单中的按钮(插槽saveData())后,我想更改MainMenu类的对象(obj_map)。是否有可能,以及如何以最好的方式做到这一点?因为我现在无法修改obj_map,因为它在不同的类中。我尝试用指针做一些事情,但结果是一个分段错误。
主窗口:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
map obj_map;
public Q_SLOTS:
void saveMap();
private:
Ui::MainWindow *ui;
};
点击主窗口中的菜单项后出现的其他窗口。
namespace Ui
{
class PreferencesWindow;
}
class PreferencesWindow : public QWidget
{
Q_OBJECT
public:
explicit PreferencesWindow(QWidget *parent = 0);
public Q_SLOTS:
void saveData();
private:
Ui::PreferencesWindow *uip;
};
从这里我需要改变obj_map
void PreferencesWindow::saveData()
{
// FROM HERE I NEED TO CHANGE obj_map
}
首选项对象在插槽中创建:
void MainWindow::saveMap()
{
PreferencesWindow *p = new PreferencesWindow();
p->show();
}
答案 0 :(得分:3)
您可以使用信号和广告位:调用saveData()
时,发出一个信号,如emit saveDataClicked()
并在MainWindow
中捕获该信号{1}}有一个名为change_obj_map
的广告位。在那里,你可以做你的改变。
所以,在MainWindow
你可以写:
connect (PreferencesWindow, SIGNAL(saveDataClicked()), this, SLOT(change_obj_map());
然后在插槽中:
void change_obj_map()
{
// Do your changes here
}
另一种方法是让obj_map
中的本地PreferencesWindow
指向obj_map
中MainWindow
地址的指针。因此,当您创建PreferencesWindow
时,您只需将MainWindow
的{{1}}地址传递给构造函数,并将该地址分配给局部变量obj_map
。
答案 1 :(得分:1)
PreferencesWindow
对象由MainWindow
创建,最简单的方法是让PreferencesWindow
个对象存储指向MainWindow
的指针:
class MainWindow;
class PreferencesWindow : public QWidget
{
Q_OBJECT
public:
explicit PreferencesWindow(MainWindow *parent = 0);
public Q_SLOTS:
void saveData();
private:
Ui::PreferencesWindow *uip;
MainWindow* m_mainwindow;
};
将指针传递给构造:
void MainWindow::saveMap()
{
PreferencesWindow *p = new PreferencesWindow( this );
p->show();
}
然后使用它:
PreferencesWindow::PreferencesWindow(MainWindow *parent) :
QWidget( parent ),
m_mainwindow( parent )
{
}
void PreferencesWindow::saveData()
{
// FROM HERE I NEED TO CHANGE obj_map
m_mainwindow->obj_map.....it's accessible!
}