2013-03-15 3 views
2

Я много искал, и я до сих пор не могу найти хороший пример того, как иметь несколько окон внутри одного приложения с GTK. Моя программа находится в C++, но я не возражаю против примера в C, который поможет мне понять принцип в любом случае.gtkmm - несколько окон/всплывающее окно

Итак, основная идея состоит в том, чтобы создать собственный производный объект от Gtk::Window в отличие от Gtk::Dialog. Dialog имеет метод запуска, который работает безупречно, чтобы открыть модальное всплывающее окно, но оно недостаточно гибко для того, что я пытаюсь сделать. Кто-нибудь знает, как я собираюсь создать новое окно, когда я нажимаю кнопку в моей программе?

Например:

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

Если вы не хотите, чтобы новое окно было модальным, просто создайте его, show() и вернитесь из метода вашего основного окна без, входящего в цикл.

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; 
} 

Добавлено для справки.

Смежные вопросы