gpt4 book ai didi

c++ - 如何在不破坏主框架的情况下终止 wxWidgets 消息循环?

转载 作者:行者123 更新时间:2023-11-28 06:45:40 25 4
gpt4 key购买 nike

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

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

当应用程序退出时,我需要 MyApp::OnExit()MyFrame 获取这个参数并保存它。所以 MyFrame 必须仍然存在于 MyApp::OnExit() 中。

我不喜欢将此参数保存在 MyFrame::OnClose() 中,因为我不想让 MyFrame 依赖于配置文件函数 - 这是应用程序类的工作更高层次。

我认为如果我正在创建一些东西,例如 OnInit() 中的 MyFrame 那么销毁它的完美位置是 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 的状态意味着对象 A 将始终需要保持最新,以了解对象 B 的哪些内容需要保存。 IMO,对象 A 对对象 B 说“嘿,救救你自己”,然后让对象 B 处理细节要好得多。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com