wxWidgets: can't inherit from wxListCtrl

旧时模样 提交于 2019-12-25 00:55:51

问题


I have a freeze problem with the following code: (EBCFrame is an inherited class (wxFrame). Look for the "else" part, thank you)

void EBCFrame::OnOpen(wxCommandEvent& event)
{
    int error = 0;
    _window = new wxScrolledWindow(this, wxID_ANY, wxPoint(0, 0), wxSize(600, 400), wxVSCROLL|wxHSCROLL);

    wxFileDialog* fileDialog = new wxFileDialog(this, wxT("Select a file"), wxEmptyString, wxEmptyString, wxT("Event Bus configuration file (*.ebf)|*.ebf|Txt|*.txt|All|*"));
    if(fileDialog->ShowModal() == wxID_OK)
    {
        //taking the file's name we want to process
        wxString tempfilename;
        tempfilename += fileDialog->GetPath();
        //need to convert to const char*
        char* filename = new char[tempfilename.length()];
        strncpy(filename, (const char*)tempfilename.mb_str(wxConvUTF8), tempfilename.length() - 1);
        //done

        _handler->Read(filename);
        //processing it
        error = _handler->GetError();
        if(error != 0)  //an error has occoured
        {
            wxMessageDialog dialog( NULL,  wxT("An error has occoured: " + wxString::FromAscii(strerror(error))), wxT("Error"), wxOK|wxICON_ERROR);
            dialog.ShowModal();
        }
        else
        {
            // Create a list in report mode
            EBCList* list = new EBCList();
            // it works instead
            //wxListCtrl* list = new wxListCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(400, 400),wxLC_REPORT|wxLC_SINGLE_SEL);
            // even if I delete the following code, and I leave only the first code line in the else section, it still freezes
            // Insert two columns
            wxListItem itemCol;
            itemCol.SetText(wxT("Param"));
            itemCol.SetImage(-1);
            itemCol.SetAlign(wxLIST_FORMAT_CENTRE);
            list->InsertColumn(0, itemCol);
            list->SetColumnWidth(0, wxLIST_AUTOSIZE );
            itemCol.SetText(wxT("Value"));
            itemCol.SetAlign(wxLIST_FORMAT_CENTRE);
            list->InsertColumn(1, itemCol);
            list->SetColumnWidth(1, wxLIST_AUTOSIZE );
            // Insert ten items
            for ( int i = 0; i < 5; i++ )
            {
                wxString buf;
                // Insert an item, with a string for column 0,
                buf.Printf(wxString::FromAscii(_handler->GetAttributeName(i + 1).c_str()), i);
                list->InsertItem(i, buf);
                // The item may change position due to e.g. sorting,
                // so store the original index in the item’s data
                list->SetItemData(i, i);
                // Set a string for column 1
                buf.Printf(wxString::FromAscii(_handler->GetAttribute(i + 1).c_str()), i);
                list->SetItem(i, 1, buf);
            }
        }
        _window->Show(true);
    }
}

Here's the header and the cpp file of the EBCList class. Header:

#ifndef EBCLIST_H
#define EBCLIST_H
#include <wx/listctrl.h>
#include <wx/menu.h>

enum LIST_ENUM
{
    wxLIST_CTRL = 1000,
    wxLIST_CTRL_EDIT
};

class EBCList : public wxListCtrl
{
    public:
        EBCList();
        ~EBCList();

        void OnActivated(wxListEvent& event);
        void OnRightClick(wxMouseEvent& event);

    private:
    // This class handles events
    DECLARE_EVENT_TABLE()
};

#endif // EBCLIST_H

Cpp:

#include "EBCList.h"

EBCList::EBCList() : wxListCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(400, 400),wxLC_REPORT|wxLC_SINGLE_SEL)
{
}

EBCList::~EBCList()
{
}

void EBCList::OnActivated(wxListEvent& event)
{

}

void EBCList::OnRightClick(wxMouseEvent& event)
{
    int flags;
    long subitem;           /* used by HitTest */
    long key = HitTest(event.GetPosition(), flags, &subitem);

    wxMenu menu;
    wxPoint pos;
    pos = event.GetPosition();
    menu.Append(wxLIST_CTRL_EDIT, _T("&Edit"));
    PopupMenu(&menu, pos.x, pos.y);
}

BEGIN_EVENT_TABLE(EBCList, wxListCtrl)
    EVT_LIST_ITEM_ACTIVATED(wxLIST_CTRL, EBCList::OnActivated)
    EVT_RIGHT_DOWN(EBCList::OnRightClick)
END_EVENT_TABLE()

I can't get why the program freezes, since the way I declared EBCList costructor is basically like a 'short-invocation' of the wxListCtrl costructor. Any help is appreciated. Thank you for your support


回答1:


You're feeding the wxListCtrl a pointer to itself as parent window in your constructor:

EBCList::EBCList() : wxListCtrl(this, ...
//                              ^^^^

try:

EBCList::EBCList(wxWindow* parent) : wxListCtrl(parent, ...

and create it as:

EBCList* list = new EBCList(this); // EBCFrame as parent


来源:https://stackoverflow.com/questions/12997366/wxwidgets-cant-inherit-from-wxlistctrl

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!