c++ - 按下 wxYES_NO 中的按钮时如何执行该功能?
问题描述
也许我的标题不清楚,所以我在这里说一个更准确的解释:
我只是在学习 WxWidgets,我现在正在尝试制作两个文件:main.cpp 和 Quit.h。Main.cpp 将包含应用程序的核心,而 Quit.h 将包含退出对话框的类:您是否真的要退出此应用程序(是/否)。
现在这是我的 Quit.h 文件(没有include
部分):
class Quit : public wxFrame
{
public:
Quit(const wxString& tekst);
};
Quit::Quit(const wxString& tekst)
{
wxMessageDialog* dial = new wxMessageDialog(NULL, _("Do you really want to quit?"), _("Quit"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION);
dial->ShowModal();
}
在这里我被困住了。我试过了wxDECLARE_EVENT_TABLE()
,但我不知道哪个事件代表这个:“按下是按钮(在 wxYES_NO 按钮系统中)”。我不能说:按下 wxYES_NO 因为这是两个按钮(YES 和 NO)。
那么当按钮 YES 被按下时如何执行该功能呢?
谢谢!
PS 对于这个不清楚的问题,我真的很抱歉,但我希望你能理解。请注意,我只是一个初学者,所以请不要在答案中使用这么多“技术性”词汇和表达方式。我阅读了文档,但它使用了很多技术表达和解释。另外,我读过这本书。
PPS 您是否注意到现在有很多关于 SE 的问题,而 COVID-19 即将到来?
编辑:当我制作程序时,我遇到了另一个错误。最小代码:
退出.h
class Quit : public wxFrame
{
public:
Quit(const wxWindow* parent, const wxString& text);
};
Quit::Quit(const wxWindow* parent, const wxString& text)
{
int dialog_return_value = wxNO;
wxMessageDialog* dial = new wxMessageDialog(NULL, text, _("Exit"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION);
dialog_return_value = dial->ShowModal();
switch (dialog_return_value)
{
case wxYES:
Close(true);
break;
case wxNO:
Close(false);
break;
default:
Close(false);
};
}
然后我在 main.cpp 中有这一行:
void MyFrame::CloseWindow(wxCommandEvent& event)
{
Quit* quit = new Quit(this, _("Do you really want to close the App?"));
}
然后它不起作用。我找不到解决方案,所以,如果你有时间,请帮忙。
再次感谢你!
解决方案
我建议使用https://docs.wxwidgets.org/3.0/overview_events.htmlwxEvtHandler::Bind<>()
的 wxWidgets 文档中详述的函数。Bind() 函数允许动态绑定事件,与设置表以将事件链接到对象相比,语法是一行代码。
另外请参阅此 wxWidgets 用户论坛线程,其中详细说明了调用成员和非成员方法https://forums.wxwidgets.org/viewtopic.php?t=39817
wxYES_NO
是一个样式标志,它告诉 wxWidgets 框架您需要在对话框中同时使用“是”和“否”按钮。检查 的返回值ShowModal()
是否等于定义为wxYES
和的内置宏之一wxNO
。
有关宏定义,请参见此处https://docs.wxwidgets.org/trunk/defs_8h.html
你应该阅读 wxDiaglog。从这里开始https://docs.wxwidgets.org/trunk/classwx_dialog.html
是否要将值返回给 的调用者Quit::Quit()
?构造函数不返回值,您可以将成员变量设置为该值,但请记住,如果对象被销毁,那么您的成员变量也会消失。您没有提供足够的信息来知道您在清理时需要做什么,Quit()
所以我将提供代码来检查返回值,只需在案例正文中填写您需要的内容即可。
以下是检查返回值的方法:
class Quit : public wxFrame
{
public:
Quit(const wxString& tekst);
};
Quit::Quit(const wxString& tekst)
{
int dialog_return_value = wxNO; // initialize to a sane default value
wxMessageDialog* dial = new wxMessageDialog(NULL, _("Do you really want to quit?"), _("Quit"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION);
dialog_return_value = dial->ShowModal();
// You do not have cancel button so only check wxYES and wxNO
switch( dialog_return_value) // Use switch, scales to more buttons later
{
case wxYES :
/* do something */
break;
case wxNO :
/* do something */
break;
default : /* ignore or handle error */ ;
};
}
您正在执行一项技术任务,可以预期会涉及到学习“技术”词汇。
推荐阅读
- rest - 尝试写入页 blob 失败并显示“错误:HTTP 标头之一的值格式不正确
- linux - SQL Developer 无法在 Linux Fedora 29 上启动
- c# - 如果用户不在 Asp.Net C# 中的 VPN 上,则访问外部服务器站点
- javascript - 如何在 React.js 中获取另一个组件的元素?
- php - 如何在 Ubuntu 上使用 Valet 进行 php-debug 扩展 - 502 Bad Gateway
- neovim - 用于预编译 nvim 二进制文件的 $VIMRUNTIME 和 $VIM 变量
- gatsby - 如何在 Gatsby V2 中将数据从 Layout 组件传递给子组件?
- azure - Azure WebApp 删除错误请求的“服务器”标头
- javascript - ASPNETZERO - 查找模式 - 如何将选定的数据返回到父模式
- python - django模型定时器删除