从另一个类访问MainWindow类成员

问题描述 投票:0回答:1

在写这里之前我搜索了很多。我发现了几个帖子,但我无法得到它们。所以我正在开始一个新职位。

我正在开发一个简单的UI。有这个主要类(见下文),它是一个主对话框,在应用程序启动时显示。

class MainWindow : public QMainWindow

MainWindow对话框上有几个按钮,当我点击一个按钮时,它隐藏了MainWindow并打开另一个QDialog框。此对话框属于如下所示的类

class libinsert : public QDialog

我这样创建libinsert对象:

void MainWindow::on_pushButton_clicked()
{
    this->hide();
    libinsert lib; // I create libinsert object this way
    lib.setModal(true);
    lib.exec();
}

这是libinsert.cpp

libinsert::libinsert(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::libinsert)
{
    ui->setupUi(this);
}

libinsert对话框打开时,我需要访问一个socket变量,它是class MainWindow的成员。我该如何实现这一目标?

我的主应用程序看起来像这样:

{
    QApplication a(argc, argv);
    MainWindow w(sock);
    w.show();
    return a.exec();
};

或者:一般来说,如何建立多个对话框作为亲子关系?

c++ qt
1个回答
1
投票

libinsert不会是MainWindow的孩子。基于QDialog的窗口始终是顶级窗口,无论您在构造它们时将其作为父窗口传递的内容。

如果在任何给定时间只存在MainWindow的单个实例(每个进程),则可以为MainWindow提供一个静态函数,该函数返回指向该窗口的指针:

class MainWindow : public QMainWindow
{
public:
    MainWindow()
    {
        theWindow = this;
    }

    virtual ~MainWindow()
    {
        theWindow = nullptr;
    }

    static get()
    {
        return theWindow;
    }

    static MainWindow *theWindow;
}

MainWindow *MainWindow::theWindow = nullptr;

然后,您的对话框可以访问主窗口的成员:

MainWindow::get()->someMemberFunction();

一种更健壮的方法是让libinsert在创建时存储指向主窗口的指针:

class MainWindow;

class libinsert : public QDialog
{
public:
    libinsert(MainWindow *mw)
    : mainWindow(mw)
    { ... }

    MainWindow *getMainWindow()
    {
        return mainWindow;
    }

    MainWindow *mainWindow;
}

当MainWindow创建对话框时,它会将指向自身的指针传递给构造函数:

void MainWindow::createDialog()
{
    libinsert *dialog = new libinsert(this):
}

即使MainWindow的多个实例同时处于活动状态,此方法也会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.