从另一个类访问 MainWindow 类成员

Posted

技术标签:

【中文标题】从另一个类访问 MainWindow 类成员【英文标题】:Access MainWindow class members from another class 【发布时间】:2017-12-28 11:41:59 【问题描述】:

在这里写之前我搜索了很多。我找到了几个帖子,但我无法完全理解它们。所以我要开始一个新帖子了。

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

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 对话框打开时,我需要访问一个套接字变量,它是class MainWindow 的成员。我如何做到这一点?

我的主应用如下所示:


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

或者:通常如何构建多个对话框,作为父子关系?

【问题讨论】:

如何创建 libinsert 对象?你作为父母传递给 QMainWindow 吗? 编辑您的问题并将其添加到那里,此外我还要求您展示如何创建 libinsert 类的对象。 您真的需要从libinsert 访问socket 变量,还是只想告诉MainWindowsocket 变量做点什么? 整个 GUI 将在单独的线程中运行。启动应用程序时会创建 2 个套接字,并将 1 个分配给此 GUI 线程,将另一个分配给主进程。这样双方就可以交流了。并且套接字到 GUI 线程的传递只发生一次,所以只有 MainWindow 可以保存它(所以我希望 MainWindow 存在直到应用程序关闭) 【参考方案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 实例同时处于活动状态,这种方法也可以工作。

【讨论】:

是的,MainWindow 只是进程中的一个实例,它不是多进程或多线程应用程序。谢谢回复。我将采用第二种方法,它看起来很优雅。我会试试这个并回到这个帖子(希望在明天:P)

以上是关于从另一个类访问 MainWindow 类成员的主要内容,如果未能解决你的问题,请参考以下文章

Qt GUI 从另一个类访问 MainWindow 的最简单方法

如何从另一个类调用指向成员的函数? [复制]

除了使用纯虚拟外,如何通过基类从派生类中获取成员

如何从另一个 Qt Widget 表单类调用 MainWindow 类

从另一个类访问 QTableWidget 的数据

当 MainWindow 从另一个类(不在主函数中)启动时,QT ui 未显示