1

私は C++ が初めてで、codelite も初めてで、wxCrafter も初めてです。いくつかの GUI アプリを作成しようとしていますが、C++ でのオブジェクト パススルーについて混乱しています。私は数時間を費やしましたが、それについて少し理解できました。まず、wxFrame/wxDialog 間で変数を渡すには、そのクラスのインスタンスを作成する必要があります。

フレーム内A.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;
}

経由で MainApp にアクセスできるようになりましparentたが、2 つのメンバー オブジェクト (1 つはそれ自体) が見つかりませんでした。私は何かを逃したのですか?私はC ++が初めてです。それはより良い方法(または正式な方法)ですか?

4

1 に答える 1

1

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-file に含めます。

#include "ApplicationData.h"

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

最後に、applicationDatawxWidgets アプリケーションの任意の場所からアクセスできます。

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

参照: wxGetAppwxWidgets リファレンスの関数定義: http://docs.wxwidgets.org/2.6/wx_appinifunctions.htmlIMPLEMENT_APP動作させるにはとDECLARE_APPマクロを追加する必要があることに注意してください。

于 2014-11-03T06:16:01.880 に答える