我一直在搜索很多,但我仍然找不到如何在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
}
一切都会有所帮助......我真的很困惑!
答案 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()
,然后从主窗口的方法返回,而不用进入循环。