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

Решение

Другой способ получить новое окно — создать указатель на переменную окна 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;
}

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

4

Другие решения

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

2

По вопросам рекламы [email protected]