在 wxSearchCtrl 上按 Enter 键未按预期触发

On Press Enter Key on wxSearchCtrl not firing as expected

我正在 visual studio 上使用 wxWidghets 编写一个 windows 应用程序,并计划在 linux 完成后为 linux 构建它并且 运行 很好在 windows 上。 我在主控件上有一个搜索控件,我在上面附加了一个搜索回车键功能,但它没有做任何事情,我无法弄清楚我没有做什么或者我应该做些什么才能让它在用户时工作将按控件上的 enter。

myframe.h

#pragma once

#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/string.h>
#include <wx/srchctrl.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/sizer.h>
#include <wx/statbox.h>
#include <wx/frame.h>

class MyFrame : public wxFrame
{
    private:

    protected:
        wxSearchCtrl* TxtSearch;
        void OnSearchButton( wxCommandEvent& event );
        void OnSearchEnter( wxCommandEvent& event );

    public:

        MyFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,300 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );

        ~MyFrame();

};

myframe.cpp

#include "myframe.h"  

MyFrame::MyFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
    this->SetSizeHints( wxDefaultSize, wxDefaultSize );

    wxBoxSizer* bSizer1;
    bSizer1 = new wxBoxSizer( wxVERTICAL );

    TxtSearch = new wxSearchCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
    #ifndef __WXMAC__
    TxtSearch->ShowSearchButton( true );
    #endif
    TxtSearch->ShowCancelButton( false );
    bSizer1->Add( TxtSearch, 1, wxALL|wxEXPAND, 5 );

    wxStaticBoxSizer* sbSizer1;
    sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("label") ), wxVERTICAL );


    bSizer1->Add( sbSizer1, 1, wxALL|wxEXPAND, 5 );


    this->SetSizer( bSizer1 );
    this->Layout();

    this->Centre( wxBOTH );

    // Connect Events
    TxtSearch->Connect( wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, wxCommandEventHandler( MyFrame::OnSearchButton ), NULL, this );
    TxtSearch->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MyFrame::OnSearchEnter ), NULL, this );
}

MyFrame::~MyFrame()
{
    // Disconnect Events
    TxtSearch->Disconnect( wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, wxCommandEventHandler( MyFrame::OnSearchButton ), NULL, this );
    TxtSearch->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MyFrame::OnSearchEnter ), NULL, this );

}

MyFrame::OnSearchButton()
{
    SetStatus("You pressed search button");
}

MyFrame::OnSearchEnter()
{
    SetStatus("You pressed enter");
}

按下搜索按钮的另一个事件实际上起作用了,我现在不能不理解。当我在网上搜索时,我只是看到了更多关于 wxPython 的文档,而我只是不知道什么是 C++。我希望对此有一些启发

根据 official wxSearchCtrl docs,您应该处理 wxEVT_SEARCH 事件,该事件在单击搜索按钮和在控件中按下 Enter 时触发。

还有,用Connect()也没什么问题,但最好用Bind(),见docs.

所以把它们放在一起:

MyFrame::MyFrame(.....)
    // Connect Events
    //TxtSearch->Connect( wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, wxCommandEventHandler( MyFrame::OnSearchButton ), NULL, this );
    //TxtSearch->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MyFrame::OnSearchEnter ), NULL, this );

    TxtSearch->Bind( wxEVT_SEARCH, &MyFrame::OnSearchButton, this );
....
//Not required but here it is:
MyFrame::~MyFrame(....)
    TxtSearch->Unbind( wxEVT_SEARCH, &MyFrame::OnSearchButton );

@Ripi2 的回答没问题,但可能无法按照 OP 的要求触发事件。我认为你需要看看你是如何创建 wxSearchCtrl 的,看看你是否正确地启动了搜索事件。 更改自:

TxtSearch = new wxSearchCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );

为此:

TxtSearch = new wxSearchCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );

让我知道这是否有效,因为我自己还没有测试过。