gtkmm - 多个窗口/弹出窗口

时间:2013-03-15 20:01:06

标签: c++ gtk gtk3 gtkmm

我一直在搜索很多,但我仍然找不到如何在GTK的同一个应用程序中使用多个窗口的好例子。我的计划位于C++,但我不介意C中的一个例子,它可以帮助我理解这个原则。

所以,基本的想法是从Gtk::Window而不是Gtk::Dialog创建我自己的派生对象。 Dialog有一个run方法可以完美地打开一个模态弹出窗口,但它不够灵活,不能满足我的目的。当我点击程序中的按钮时,有没有人知道如何生成一个新窗口?

例如:

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 个答案:

答案 0 :(得分:4)

拥有一个新窗口的另一种方法是创建一个指向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;
}

已添加以供参考。

答案 1 :(得分:2)

如果您不希望新窗口是模态的,那么只需创建它,show(),然后从主窗口的方法返回,而不用进入循环。