2013-03-15 162 views
2

我一直在尋找很多,我仍然無法找到一個很好的例子,如何在同一個應用程序中使用GTK。我的程序是C++,但我不介意C中的一個例子,它可以幫助我理解原理。gtkmm - 多個窗口/彈出窗口

所以,基本思想是從Gtk::Window創建我自己的派生對象,而不是Gtk::DialogDialog有一個運行方法,它可以完美地打開一個模式彈出窗口,但它對於我所要做的並不夠靈活。有人知道當我點擊程序中的按鈕時,如何產生一個新窗口?

例如:

void MainWindow::on_button_clicked() 
{ 

    NewWindow window; 
    //Some code to display that window and stay in a loop until told to return 
} 

凡NewWindow從Gtk::Window得出這樣:

class NewWindow : public Gtk::Window 
{ 

    //Normal stuff goes here 

} 

任何幫助......我真糊塗了!

回答

2

如果您不希望新窗口爲模態,那麼只需創建它,然後從您的主窗口的方法返回而不需要進入循環。

3

的另一種方法有一個新的窗口是創建一個指向一個GTK窗口變量(Gtk::Window* about_window_;)然後GTK的窗口變量設置爲其它窗口(about_window_ = new Window;)的一個新實例,在此之後顯示新的窗口(about_window_->show(); )。下面是一個完整的例子:

class AboutWindow : public Gtk::Window 
{ 
public: 
    AboutWindow(); 
    ~AboutWindow(); 

protected: 
    Gtk::Label lbl_; 
}; 

AboutWindow::AboutWindow() 
{ 
    this->set_default_size(100, 100); 
    this->set_title("About"); 

    lbl_.set_label("About label"); 
    this->add(lbl_); 

    this->show_all_children(); 
} 

AboutWindow::~AboutWindow() 
{ 

} 

class MainWindow : public Gtk::Window 
{ 
public: 
    MainWindow(); 
    virtual ~MainWindow(); 

protected: 
    void onButtonClicked(); 
    void aboutWinClose(); 

    Gtk::Button button_; 
    Gtk::Label lbl_; 
    Gtk::Box box_; 
    Gtk::AboutWindow* aboutw_; 
}; 

MainWindow::MainWindow() 
{ 
    this->set_default_size(100, 100); 
    box_.set_orientation(Gtk::ORIENTATION_VERTICAL); 
    this->add(box_); 
    box_.pack_start(lbl_); 

    lbl_.set_label("a test"); 

    button_.set_label("Open About Window"); 
    box_.pack_end(button_); 

    button_.signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onButtonClicked)); 

    aboutw_ = 0; 

    this->show_all_children(); 
} 

MainWindow::~MainWindow() 
{ 

} 

void MainWindow::onButtonClicked() 
{ 
    if(aboutw_ != 0) 
     return; 

    aboutw_ = new AboutWindow; 
    aboutw_->signal_hide().connect(sigc::mem_fun(*this, &MainWindow::aboutWinClose)); 
    aboutw_->show(); 
} 

void MainWindow::aboutWinClose() 
{ 
    aboutw_ = 0; 
} 

添加僅供參考。