あなたが描くことになっていない
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create("org.gtkmm.example");
refBuilder = Gtk::Builder::create();
try{
refBuilder->add_from_file("main_window2.glade");
}
catch(const Glib::FileError& ex){
std::cerr << "FileError: " << ex.what() << std::endl;
return 1;
}
catch(const Glib::MarkupError& ex){
std::cerr << "MarkupError: " << ex.what() << std::endl;
return 1;
}
catch(const Gtk::BuilderError& ex){
std::cerr << "BuilderError: " << ex.what() << std::endl;
return 1;
}
refBuilder->get_widget("main_window", main_window);
cout << "window: " << main_window << endl;
if(main_window)
{
Gtk::ImageMenuItem* newButton = nullptr;
Gtk::ImageMenuItem* openButton = nullptr;
Gtk::ImageMenuItem* saveButton = nullptr;
Gtk::Button* playButton = nullptr;
refBuilder->get_widget("new_button", newButton);
refBuilder->get_widget("open_button", openButton);
refBuilder->get_widget("save_button", saveButton);
refBuilder->get_widget("play_button", playButton);
refBuilder->get_widget("image_container", container);
refBuilder->get_widget("image_component", image_component);
if(playButton)
playButton->signal_clicked().connect(sigc::ptr_fun(on_image_draw));
if(newButton)
newButton->signal_activate().connect(sigc::ptr_fun(on_new_button_activate));
if(openButton)
openButton->signal_activate().connect(sigc::ptr_fun(on_open_button_activate));
if(saveButton)
saveButton->signal_activate().connect(sigc::ptr_fun(on_save_button_activate));
cout << "running main window" << endl;
app->run(*main_window);
}
delete main_window;
とのplayButtonでクリックしたときに、描画コードが呼び出され、すべてのフレームはdraw
シグナルハンドラにあります。基本的に画像を設定してからqueue_draw
に電話する必要があります。あなたはこの権利をしていますが、GTK +にその作業の一部をさせる必要があります。ちょうどループすることはできません:queue_draw
を呼び出すと、画像を描画するためにGTK +が処理する必要のあるメインループにdraw
イベントが挿入されます。
あなたはシングルスレッドなので、CPUはシャベルのようなものです。あなたがコールバックしているとき、あなたはシャベルを手に入れて仕事をします。 GTK +にシャベルを返さないと、GTK +が送信したイベントを処理することは期待できません。
ここでは、このようなものを整理する方法を説明します。 25fpsが必要な場合、このアプローチは最適ではないので、おそらくgstreamer
のようなビデオライブラリを見てください。
再生を押すと、タイマーやアイドルハンドラのようなイベントソースがトリガーされます。それはあなたが何か言いたいことがあるからです:私は新しいイメージを演出する必要があります。 GLibの中でg_timeout_add
またはg_idle_add
を見てください(私はC APIの名前だけを知っています、gtkmmに相当するものを見つける)。
次に、タイムアウトまたはアイドルイベントに関連付けられたコールバックで、イメージを設定します(単一のループ、ループなし)。 queue_draw
を呼び出すかどうかは不明です。 GtkDrawingAreaで手描きしていたのですが、それはGtkImageなので、新しい画像を設定すると暗黙のうちに画像が変更され、再描画されるはずです。
コードを追加してください。 – anhoppe
ok、コードが追加されました。 –