更改其他类qt的对象

时间:2015-11-24 13:44:06

标签: c++ qt

我正在使用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();
}

2 个答案:

答案 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_mapMainWindow地址的指针。因此,当您创建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!
}