3

私はたくさん検索してきましたが、同じアプリケーション内に複数のウィンドウを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

}

何でも助けてくれます...私はここで本当に混乱しています!

4

2 に答える 2

5

新しいウィンドウを作成するもう 1 つの方法は、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;
}

参考までに追加。

于 2014-01-08T23:58:27.130 に答える
2

新しいウィンドウをモーダルにしたくない場合は、単純にそれを作成し、ループに入らshow()にメイン ウィンドウのメソッドから戻ります。

于 2013-03-17T12:29:10.240 に答える