retireSakiの日記

たぶん引退した?ソフトウエアエンジニアのブログ

GTKmm (3.0) と glade によるアプリ (10) - プログレスバーと2つのモード

 今回は、前回の" GTKmm (3.0) と glade によるアプリ (9) - 子ウィンドウとインターバルタイマー "で作成したプログラムを使って、プログレスバーを2つのモードで表示してみたいと思います。

https://retiresaki.hatenablog.com/entry/2018/11/09/210700retiresaki.hatenablog.com

最終的にこんな感じですね。

f:id:retireSaki:20181107161639j:plain

ソースコードは最後に両方の機能を含めたものを公開。(zipダウンロードできます)


プログレスバーの2つのモード

1) activityモード

f:id:retireSaki:20181107161735j:plain

 バーが左右(または上下)に動き、何らかの処理が行われていることを示します。
 完了値が不明な処理などに使います。
 例えば、文字列検索など。

2) パーセントモード

f:id:retireSaki:20181107161639j:plain

 バーが伸びる(または縮む)ことにより、処理の進捗割合を示します。
 完了値が明確な処理などに使います。
 例えば、ファイル転送や圧縮など。

■ 各ソースファイルの修正

1) glade で子ウィンドウをデザイン

f:id:retireSaki:20181107161805j:plain

 ・activity表示とパーセント表示を切り替えるためのチェックボタン
 ・プログレスバー
 を設置します。

 プログレスバーは、
  縦・横表示
  左右反転動作
 に変更もできます。

 パルスステップ数を増減することで、activityモードの時のバーの動きの速さが変わります。

 ※ 詳細は添付のgladeファイルを確認してください。

2) 子ウィンドウクラス Child_Window の変更 (Child_Window.cc, Child_Window.h)

 先に追加したコードから


● Child_Window.h

protected:

    Gtk::CheckButton *m_chk_progmode = nullptr;
    Gtk::ProgressBar *m_progressbar = nullptr;
…


● Child_Window.cc

void Child_Window::setInit_display()
{

    // get widget
    refBuilder->get_widget("chk_progress_mode", m_chk_progmode);
    refBuilder->get_widget("progress_bar", m_progressbar);
…
}
…
bool Child_Window::on_timeout()
{

    if (m_chk_progmode->get_active()){
        m_progressbar->pulse();
    }
    else {
        double new_val = m_progressbar->get_fraction() + 0.01;

        if (new_val > 1.0)
            new_val = 0.0;
        m_progressbar->set_fraction(new_val);
    }
…
}

 プログレスバー表示モードの切り替え用のチェックボックス
   Gtk::CheckButton *m_chk_progmode
 プログレスバー
   Gtk::ProgressBar *m_progressbar
 とします。

 チェックボタンは、Gtk::ToggleButtonを継承しているので get_active() を使って、状態を取得します。
  get_active() が true はチェック時
  get_active() が false は未チェック時

 今回、チェックされていれば activityモードとし、未チェックのときは パーセントモードとします。

(2.1) activityモード

 プロゲスバーで pulse() をすることで、プログレスバーに動きを促します。
 プログレスバーに動きは、
 void Gtk::ProgressBar::set_pulse_step ( double fraction ); で動きの大きさを指定するか、
 pulse(); を呼び出すタイミングに影響を受けます。

(2.2) パーセントモード

 void Gtk::ProgressBar::set_fraction ( double fraction ); で進捗値(%/100)を指定します。
 つまり、0.00〜1.00 で指定

 今回はループさせているため、get_fraction(); で現在の進捗値を取得し、1.00 (100%)を超えたら、0.00に戻しています。


以上、簡単でしたね!
ネットを見るとチェックボタンの状態取得は、ちょっとしたマメ知識扱いになっていますが、継承しているクラスを理解していればすぐに分かると思います。
devhelp などを使い、Gtk::CheckButton のクラスリファレンスを開けば、クラスの相関図が表示されているので、そこから追跡すると良いでしょう。


最後に、全てのファイルを圧縮したファイル(zip)を載せます。

●ソース一式

www.mediafire.com

GTKプログラミングを学習するなら!

Gtk+3入門

Gtk+3入門

GTK+・GDKによるLinuxアプリケーション開発 (New riders)

GTK+・GDKによるLinuxアプリケーション開発 (New riders)

Learn GTK# Programming

Learn GTK# Programming

注目記事

「Amazon.co.jpアソシエイト」または「[乙の名称を挿入]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。