0

何時間もの間、 wxWidgetsからwxListBoxを使用する方法を学ぼうとしてきました。「アプリケーション」を公式のチュートリアルに基づいて作成しましたが、コードが元のコードとそれほど変わらないにもかかわらず、機能させることができません。

wxListBox に新しいアイテムを追加したいのですが、代わりにSegmentation faultが発生します。これが私のコードです:

class CWindow : public wxFrame {
    wxBoxSizer      *hbox, *vbox;
    wxListBox           *list;
    wxButton            *btnAdd, *btnRemove;

public:
    CWindow(int w = 640, int h = 480) : wxFrame(NULL, -1, wxT("Test"), wxDefaultPosition, wxSize(w, h)) {
        list = new wxListBox(this, wxID_ANY, wxDefaultPosition, wxSize(w-100, h));
        btnAdd = new wxButton(this, -1, wxT("Add"));
        btnAdd->Connect(wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) &CWindow::OnNew);
        btnRemove = new wxButton(this, -1, wxT("Remove"));

        vbox = new wxBoxSizer(wxVERTICAL);
        vbox->Add(btnAdd, 1, wxALL | wxEXPAND, 0);
        vbox->Add(btnRemove, 1, 0, 0);

        hbox = new wxBoxSizer(wxHORIZONTAL);
        hbox->Add(list, 1, 0, 0);
        hbox->Add(vbox, 0, 0, 0);

        SetSizer(hbox);
    }

    void OnNew(wxCommandEvent &event) {
        wxString str = wxGetTextFromUser(wxT("New item:"));
        if (str.Len() > 0) list->InsertItems(1, &str, 0); //this line is suspected of causing segfault
    }
};

私の問題の原因は何ですか?

PS。チュートリアルの例は問題なく動作するため、ライブラリのバグの可能性はありません。

編集: gdbデバッガーはこれを報告します:

0x00007ffff7a8e492 in wxListBoxBase::InsertItems(unsigned int, wxString const*, unsigned int) () from /usr/lib/x86_64-linux-gnu/libwx_gtk2u_core-2.8.so.0

EDIT2:より多くのgdbダンプ以前:

    Breakpoint 1, CWindow::OnNew (this=0x725cd0, event=...) at listbox.cpp:32
    32 if (str.Len() > 0) list->InsertItems(1, &str, 0);
(gdb) print list
    warning: can't find linker symbol for virtual table for `CWindow' value
    $1 = (wxListBox *) 0x0
(gdb) up
    #1  0x00007ffff7586d35 in wxEvtHandler::ProcessEventIfMatches(wxEventTableEntryBase         const&, wxEvtHandler*, wxEvent&) ()
    from /usr/lib/x86_64-linux-gnu/libwx_baseu-2.8.so.0
4

2 に答える 2

0

投稿したデバッグ出力から、問題はリストボックスの使用ではなく、wxFrame の使用にあります。wxApp インスタンスで wxFrame の処理を​​台無しにしたと思います。

最小限のサンプルから始めて、そこから段階的にアプリケーションを構築することをお勧めします。

于 2012-08-07T18:12:36.480 に答える
-2

たくさんのアドバイスのおかげで、問題を解決することができました。ボタンを機能に直接接続することが原因でした。各ボタンには対応する識別子が必要なようです。

したがって、これは間違っています:

button = new wxButton(this, wxID_ANY, wxT("label"));
(...)
button->Connect(wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) &CWindow::OnClick);

そして、これは良いです:

button = new wxButton(this, EVT_OnClick, wxT("label"));
(...)
Connect(EVT_OnClick, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) &CWindow::OnClick);
于 2012-08-08T12:23:13.237 に答える