2013-10-13 34 views
0

wxWidgets hello world tutorial表現出奇怪的行爲。當我添加使用以下行MyFrame構造一個面板到應用程序:當wxPanel添加時輸入關閉wxWidgets應用程序

wxPanel *panel = new wxPanel(this); 

的[返回]和[鍵盤輸入]鍵導致程序退出(清潔檢測關閉事件)。

這是爲什麼?沒有wxPanel,鍵盤什麼也不做。

下面是與添加的行代碼:

// hworld.cpp 
// Version using dynamic event routing 

#include <wx/wx.h> 

class MyApp : public wxApp 
{ 
    virtual bool OnInit(); 
}; 

IMPLEMENT_APP(MyApp) 


class MyFrame : public wxFrame 
{ 
public: 
    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); 
    void OnQuit(wxCommandEvent& event); 
    void OnAbout(wxCommandEvent& event); 
}; 

enum 
{ 
    ID_Quit=1, 
    ID_About 
}; 


bool MyApp::OnInit() 
{ 
    MyFrame *frame = new MyFrame(_("Hello World"), wxPoint(50, 50), 
           wxSize(450, 350)); 

    frame->Connect(ID_Quit, wxEVT_COMMAND_MENU_SELECTED, 
        (wxObjectEventFunction) &MyFrame::OnQuit); 
    frame->Connect(ID_About, wxEVT_COMMAND_MENU_SELECTED, 
        (wxObjectEventFunction) &MyFrame::OnAbout); 

    frame->Show(true); 
    SetTopWindow(frame); 
    return true; 
} 

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) 
    : wxFrame(NULL, -1, title, pos, size) 
{ 
    wxMenuBar *menuBar = new wxMenuBar; 

    wxMenu *menuFile = new wxMenu; 

    menuFile->Append(ID_About, _("&About...")); 
    menuFile->AppendSeparator(); 
    menuFile->Append(ID_Quit, _("E&xit")); 

    menuBar->Append(menuFile, _("&File")); 

    // Added line causing failure. 
    wxPanel *panel = new wxPanel(this); 

    SetMenuBar(menuBar); 

    CreateStatusBar(); 

    SetStatusText(_("Welcome to wxWidgets!")); 
} 

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) 
{ 
    Close(true); 
} 

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) 
{ 
    wxMessageBox(_("wxWidgets Hello World example."), 
       _("About Hello World"), 
       wxOK|wxICON_INFORMATION, this); 
}   
+0

你描述的行爲在這裏是不可重複的(當然,這是意想不到的,不應該發生)。你使用哪個平臺和版本的wxWidgets? –

+0

這在Windows 7的2.9版本中發生。我將更新到2.9.5並查看是否可以解決此問題。 –

回答

0

它現在正在運行,但它是一個很大的猜測,爲什麼。該計劃從未崩潰。我在調試中追蹤到它,並且正在調用關閉事件。

該關閉時[Enter]鍵被按下:

wxPanel *panel = new wxPanel(this); 

由於做所有這些:

wxPanel *panel = new wxPanel(this, wxID_ANY); 
wxPanel *panel = new wxPanel(this, wxID_ANY, wxDefaultPosition); 
wxPanel *panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); 

但不會關閉與[Enter]鍵被按下:

wxPanel *panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxEXPAND); 

也不關閉:

wxPanel *panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxEXPAND); 
wxPanel *panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxCLIP_CHILDREN); 
wxPanel *panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxEXPAND | wxCLIP_CHILDREN); 

但是,這再次關閉:

wxPanel *panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxEXPAND | wxCLIP_CHILDREN | wxTAB_TRAVERSAL); 

顯然,如果wxTAB_TRAVERSAL是參與式的(它是默認的構造BTW),將您的[Enter]鍵按鍵傳播到wxFrame和點擊[X]關閉按鈕。

唯一的甚至接近一個暗示就是在documentation一個神祕的和看似風馬牛不相及注:

Tab traversal is implemented through an otherwise undocumented intermediate wxControlContainer class from which any class can derive in addition to the normal wxWindow base class. Please see wx/containr.h and wx/panel.h to find out how this is achieved. 
if not all characters are being intercepted by your OnKeyDown or OnChar handler, it may be because you are using the wxTAB_TRAVERSAL style, which grabs some keypresses for use by child controls. 

這是我最好的猜測。我不知道這是故意行爲還是錯誤。

+0

請注意,使用'wxEXPAND'作爲wxPanel樣式標誌沒有任何意義。 –

+0

是的,這一切都是通過隨機扔出來的,wxEXPAND是第一個彈出的。不記得或在意當時是否有效。只是想覆蓋Tab Traversal。 –

0

它可能崩潰....

我知道這已經但檢查這裏:http://docs.wxwidgets.org/trunk/classwx_panel.html

它會提到它是小組是故意這樣做的。

任何wxWindow都可以使用wxSizer,這是一個可以放置東西的東西(比如box sizers和東西)。

雖然wxWindow的母公司是在事情(除非是頂級),它必須在父內施膠機。

你想要的東西,如:

wxSizer* mySizer = new wxBoxSizer(WX_VERTICAL); 
setSizer(mySizer); 
wxWindow newWindow = new wxPanel(this); 
mySizer->Add(newWindow,1,WX_EXPAND); 

1是額外的空間,該窗口將獲得總共爲(在這種情況下,1)的比例,在篩分器(垂直)的方向

展開標誌意味着「在此情況下水平填充軸中尺寸不是」您的空間。所以它會填滿sizer給它的所有空間。

如果你有一個水平尺寸選擇器(用來放置物體)和2個按鈕,如果一個具有權重1,另一個2,那麼具有2個權重的那個將獲得sizer提供的任何空間的2/3rds,使用。

每個窗口都有一個期望的大小,它希望成爲一個規模至少,如果我們有300個像素和按鈕只希望爲每個100,重量2人會得到額外66px。

你明白了。

我在這裏的名字(WX_EXPAND)可能是錯誤的,我先用wxPython(wx.EXPAND)然後來到wxWidgets,我主要使用IDE來獲得正確的名稱。

如果您正在學習wx,請考慮wxPython。

+0

感謝您的回覆。我確定它確實調用了一個乾淨的Close()並且沒有崩潰,並且我已經有了一個使用sizer的應用程序。基於hello世界的問題只是顯示問題的最簡單的方法。這就像[Enter]正在擊中[X]按鈕。 –

+0

那麼你完全缺乏代碼使它無法幫助你@Präriewolf –

+0

我包括一個超鏈接的代碼示例,以及我添加的行和我添加它的位置。 –

相關問題