2012-12-14 50 views
0

我目前正在用C++編寫一個小型的桌面應用程序,這是我第一次使用gtkmm。gtkmm派生窗口部件的空白窗口

我遵循here的教程,但我得到的只是一個空白窗口。它在將MainWindow重構爲它自己的類之前有效...

請注意:我已經忽略了includes,usings和signal handler實現。

這是我的主要功能:

int main(int argc, char **argv) 
{ 
    RefPtr<Application> app = Application::create(argc, argv, "org.mw88.adbtool"); 
    //Main kit(argc, argv); 

    RefPtr<Builder> builder = Builder::create(); 
    try 
    { 
     builder->add_from_file("Gui.glade"); 

     MainWindow *window = NULL; 
     builder->get_widget_derived("MainWindow", window); 
     app->run(*window); 
     //kit.run(*window); 
    } 
    catch (const FileError& ex) 
    { 
     cerr << "FileError: " << ex.what() << endl;   
     return EXIT_FAILURE; 
    } 
    catch (const MarkupError& ex) 
    { 
     cerr << "MarkupError: " << ex.what() << endl;   
     return EXIT_FAILURE; 
    } 
    catch (const BuilderError& ex) 
    { 
     cerr << "BuilderError: " << ex.what() << endl; 
     return EXIT_FAILURE; 
    } 

    return EXIT_SUCCESS; 
} 

我的主窗口,部首:

class MainWindow : public Window 
{ 
public: 
    MainWindow(BaseObjectType* cobject, const RefPtr<Builder>& refBuilder); 
    virtual ~MainWindow(); 
    void show(RefPtr<Application> &app); 

private: 
    RefPtr<Builder>  builder; 
    ToolButton   *addButton; 
    ToolButton   *editButton; 
    ToolButton   *deleteButton; 
    ToolButton   *connectButton; 
    TreeView   *hostList; 
    RefPtr<ListStore> listStore; 
    Columns    cols; 

    //Signal handlers: 
    virtual void onAddClicked(); 
    virtual void onEditClicked(); 
    virtual void onDeleteClicked(); 
    virtual void onConnectClicked(); 
}; 

這是主窗口類的構造函數:

MainWindow::MainWindow(BaseObjectType* cobject, const RefPtr<Builder>& refBuilder) 
{ 
    this->builder = refBuilder; 

    addButton = NULL; 
    editButton = NULL; 
    deleteButton = NULL; 
    connectButton = NULL; 
    hostList = NULL; 

    builder->get_widget("hostList", hostList); 

    builder->get_widget("addButton", addButton); 
    addButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onAddClicked)); 

    builder->get_widget("editButton", editButton); 
    editButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onEditClicked)); 

    builder->get_widget("deleteButton", deleteButton); 
    deleteButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onDeleteClicked)); 

    builder->get_widget("connectButton", connectButton); 
    connectButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onConnectClicked)); 

    hostList->set_model(listStore = ListStore::create(cols)); 
    hostList->append_column("Host", cols.host); 
    hostList->append_column("Port", cols.port); 

    for (int i = 0; i < 20; i++) 
    { 
     TreeModel::Row row = *(listStore->append()); 
     row[cols.host] = "Testhost"; 
     row[cols.port] = i; 
    } 

    show_all_children(); 
} 

似乎所有小部件從構建器正確返回,但app-> run只顯示一個空的窗口。這可能是什麼原因?

回答

3

你的構造是不完整的,你需要的CObject初始化基類:

MainWindow::MainWindow(BaseObjectType* cobject, const RefPtr<Builder>& refBuilder) 
    : Gtk::Window(cObject) // add this 
{ 
    this->builder = refBuilder; 
    ... 
+0

謝謝你,這是問題;-) – mw88