访问wxFrame(s)& wxDialog全球

时间:2014-11-03 05:43:52

标签: c++ wxwidgets codelite

我是C ++的新手,也是codelite的新手,也是wxCrafter的新手。我正在尝试构建一些GUI应用程序,但我在C ++中搞砸了对象passthrough。我花了几个小时,我只是理解了一点。首先,要在wxFrame / wxDialog之间传递变量,我应该创建该类的实例。

在frameA.cpp

void frameA::buttonAClicked() {
    frameB * frameB1 = new frameB(NULL);
    frameB1->connect(this);
}

在frameB.cpp

void frameB::connect(frameA *upper) {
    //now I can access frameA via upper
}

但是对于更复杂的情况(例如10帧),用户输入的值需要在帧之间共享。我认为最好让父级处理帧/对话框。由于所有类都是由main.cpp触发的,所以我认为MainApp()会是个好主意。所以我试着这样做:

main.cpp中:

class MainApp : public wxApp {
public:
frameA * frameA1;
frameB * frameB1
//frameC, frameD, frameE etc.
MainApp() {}
virtual ~MainApp() {}
virtual bool OnInit() {
    frameA1 = new frameA(NULL);
    frameB1 = new frameB(NULL);
    frameA1->connect(this);
    frameB1->connect(this);

    SetTopWindow(frameA);
    return GetTopWindow()->Show();
}
};
在frameA.cpp和frameB.cpp中都

frameA::connect(wxApp *par) {
    this->parent = par;
}

现在我可以通过parent访问MainApp,但是找不到两个成员对象(一个是自身)。我错过了什么吗?我是C ++的新手。这是更好的方式(或正式方式)吗?

1 个答案:

答案 0 :(得分:0)

在wxWidgets应用程序中有一种方便的方法来制作全局数据。创建文件ApplicationData.h

#pragma once    // replace with #ifndef ... if not supported by your compiler

class frameA;
// place here required forward declarations
// ...

struct ApplicationData
{
    frameA* frameA1;
    // any other data you need
};

将此文件包含在应用程序类h文件中:

#include "ApplicationData.h"

class MainApp: public wxApp
{
public:
    ApplicationData applicationData;  // or may it private with get/set functions
    ...
};

最后,您可以从wxWidgets应用程序的任何位置访问applicationData

ApplicationData* pData = &wxGetApp().applicationData;
// Set/read global data members here:
// pData->...

另请参阅:wxWidgets中的wxGetApp函数定义参考:http://docs.wxwidgets.org/2.6/wx_appinifunctions.html请注意,您必须添加IMPLEMENT_APPDECLARE_APP宏才能使其正常工作。