首页 > 解决方案 > 按下 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?"));
}

然后它不起作用。我找不到解决方案,所以,如果你有时间,请帮忙。

再次感谢你!

标签: c++eventsmodal-dialogwxwidgets

解决方案


我建议使用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 */ ;
    };
}

您正在执行一项技术任务,可以预期会涉及到学习“技术”词汇。


推荐阅读