我是wxWidgets的初学者。我通过在Destroy()事件处理程序中调用MyFrame::OnClose()来终止应用程序的标准方式存在问题:

MyApp::OnInit()中,我使用从配置文件中加载的构造函数参数(使用依赖注入)创建MyFrame。此参数存储在MyFrame内部,并可在MyFrame的生存期内更改。

当应用程序退出时,我需要MyApp::OnExit()MyFrame获取此参数并将其保存。因此,MyFrame必须仍然存在于MyApp::OnExit()中。

我不希望将此参数保存在MyFrame::OnClose()中,因为我不想MyFrame依赖于配置文件功能-这就是更高级别的应用程序类的工作。

我认为如果我要创建某些内容,例如在MyFrame中创建OnInit(),那么销毁它的理想位置就是OnExit(),对吗?因此,是否存在一些正确的方法来延迟销毁MyFrameMyApp::OnExit()

myapp.cpp:

#include <wx/wx.h>
#include "myframe.h"

class MyApp : public wxApp {
public:
    virtual bool OnInit() override;
    virtual int  OnExit() override;
    MyFrame* m_myframe;
};


IMPLEMENT_APP( MyApp );

extern int  LoadSettings();
extern void SaveSettings( int param );

bool MyApp::OnInit()
{
    const int param = LoadSettings();
    m_myframe = new MyFrame( "MyFrame title", param );
    m_myframe->SetIcon( wxICON(aaaa) );
    m_myframe->Show();
    return true;
}

int MyApp::OnExit()
{
    const int param = m_myframe->GetParameter();
    SaveSettings( param );
    m_myframe->Destroy();
    return 0;
}


myframe.h:

#include <wx/wx.h>

class MyFrame: public wxFrame {
public:
    MyFrame( const wxString& title, int param );
    int GetParameter() const { return m_param; }
    /* ... */
private:
    void OnClose( wxCloseEvent& event );
    int m_param;
};


myframe.cpp:

#include "myframe.h"

MyFrame::MyFrame( const wxString& title, int param )
:   wxFrame( nullptr, -1, title ),
    m_param( param )
{
    Bind( wxEVT_CLOSE_WINDOW, &MyFrame::OnClose, this );
}

void MyFrame::OnClose( wxCloseEvent &event )
{
    // Want to terminate message loop but without destroying this
    // Destroy();
}

最佳答案

也许在MyFrame :: OnClose()中,您可以让它发出boost :: signal通知订阅者它即将被销毁?当然,您将在MyApp中设置一个方法,该方法将在发出此信号时调用,并让该方法保存该参数。

稍微相关一点的是,每当销毁wxFrame派生的对象时,我总是会做类似的事情。也就是说,我希望它在销毁某些信息之前将其保存到持久性存储中。我处理此问题的方法是简单地使用wxConfig。我将在wxEVT_CLOSE_WINDOW处理程序方法中获取全局wxConfig对象的句柄,然后保存所需的内容。

对我来说,这是一个更清洁的设计。对象应负责将自身保存到持久性存储中。由另一个对象A(在您的情况下,您的MyApp对象)负责保存对象B的状态,这意味着将始终需要就对象B的哪些内容需要保持最新的状态。 IMO,最好让对象A对对象B说“嘿,保存自己”,然后让对象B处理细节。

关于c++ - 如何在不破坏主机的情况下终止wxWidgets消息循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25044296/

10-10 20:55