我是wxWidgets的初学者。我通过在Destroy()
事件处理程序中调用MyFrame::OnClose()
来终止应用程序的标准方式存在问题:
在MyApp::OnInit()
中,我使用从配置文件中加载的构造函数参数(使用依赖注入)创建MyFrame
。此参数存储在MyFrame
内部,并可在MyFrame
的生存期内更改。
当应用程序退出时,我需要MyApp::OnExit()
从MyFrame
获取此参数并将其保存。因此,MyFrame
必须仍然存在于MyApp::OnExit()
中。
我不希望将此参数保存在MyFrame::OnClose()
中,因为我不想MyFrame
依赖于配置文件功能-这就是更高级别的应用程序类的工作。
我认为如果我要创建某些内容,例如在MyFrame
中创建OnInit()
,那么销毁它的理想位置就是OnExit()
,对吗?因此,是否存在一些正确的方法来延迟销毁MyFrame
到MyApp::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/