2017-10-27 11 views
0

gtkmm3へのgtkmm2アプリケーションの移植を開始しましたが、変更に応じてアプリケーション内からウィジェットの色などのプロパティを変更するための正しいメカニズムについては明確ではありません州の以下は、私が達成しようとしている、ボタン画像とテキストの色をある定義された状態に応じて反転させるための簡単な例です:gtkmm3/gtk3でプログラムでウィジェットのpreopertiesを変更する

私はウィンドウ(Gwin)を作成し、起動時にウィジェットの最初の状態を定義するのに十分である文字列:

int main(int argc, char *argv[]) 
{ 
    try 
    { 
     Gtk::Main *kit(new Gtk::Main(argc, argv)); 
     GWin *dl(new GWin(sdi, argc, argv)); 

     auto screen = dl->get_screen(); 
     Glib::RefPtr<Gtk::CssProvider> css(Gtk::CssProvider::create()); 
     Glib::RefPtr<Gtk::StyleContext> style(dl->get_style_context()); 

     Glib::ustring theme(
         "@define-color bg rgb(57.64%, 48.62%, 36.47%);" 
         "@define-color BtnBg rgb(23.13%, 19.60%, 16.07%);" 
         ".background { background-color: @bg; }" 
         "button" 
         "{" 
         " background-image:image(@BtnBg);" 
         " border-color: @bg;" 
         " color: rgb(80.%, 80.%, 80.%);" 
         " padding-left: 4px;" 
         " padding-right: 4px;" 
         "}" 
         "button:hover" 
         "{" 
         " background-image:image(rgb(77%, 81%, 84%));" 
         " color: rgb(0.%, 0.%, 0.%);" 
         "}" 
         "#LSK0 { background-image: image(@bg); border-color:@bg }" 
         "#RSK0 { background-image: image(@bg); border-color:@bg }" 
        ); 
     css->load_from_data(theme); 
     style->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); 



    dl->Run(); 
    delete kit; 
    } 
    catch(const std::string &e) 
    { 
     std::cout << "ERROR: GWin now exits:\n" << e << std::endl; 
    } 
    return(0); 
} 

は今GWINクラス内、コードの関連部分はされていmRunButtonのGtk ::ボタン上で動作し、次のシグナルハンドラでありますmRunButton.set_name( "RunButton")で初期化されます。

void GCDU::onBtnLight(bool on) 
{ 
    // The GTK3 code 
    Glib::RefPtr<Gtk::CssProvider> css(Gtk::CssProvider::create()); 
    Glib::RefPtr<Gtk::StyleContext> style(mRunButton.get_style_context()); 

    Glib::ustring theme(on ? 
         "#RunButton { background-image: image(rgb(80%, 80%, 80%); color: rgb(0.%, 0.%, 0.%); }" 
         : 
         "#RunButton { background-image: image(rgb(23.13%, 19.60%, 16.07%)); color: rgb(80.%, 80.%, 80.%); }" 
        ); 
    css->load_from_data(theme); 
    style->add_provider(css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); 

    // The old GTK2 code 
    //Gdk::Color c(mButtonBG); 
    //Gdk::Color f; 
    //if(on) 
    //{ 
    // c.set("white"); 
    // f.set("black"); 
    //} 
    //else 
    //{ 
    // f.set("white"); 
    //} 
    //mRunButton.modify_bg(Gtk::STATE_NORMAL, c); 
    //mRunButton.get_child()->modify_fg(Gtk::STATE_NORMAL, f); 
} 

私は検索しましたが、ほとんどの質問とその回答は、実行開始時にテーマのスタイルプロパティを1回設定するか、現在は推奨されていないoverride_メソッドを使用することに限定されています。

ご質問ありがとうございます。

答えて

0

thisthisのような質問からさらに研究を重ねた結果、私が必要としていることを行う正しい方法だとわかりました。ウィンドウにCSSプロバイダを追加するとき

基本的にはウィジェットのスタイルが保持することの状態のプロパティを定義します(メインから更新

)問題の上:

Glib::ustring theme(
         "@define-color bg rgb(57.64%, 48.62%, 36.47%);" 
         "@define-color BtnBg rgb(23.13%, 19.60%, 16.07%);" 
         ".background { background-color: @bg; }" 
         "button" 
         "{" 
         " background-image:image(@BtnBg);" 
         " border-color: @bg;" 
         " color: rgb(80.%, 80.%, 80.%);" 
         " padding-left: 4px;" 
         " padding-right: 4px;" 
         "}" 
         "button:hover" 
         "{" 
         //" background-image:image(rgb(77%, 81%, 84%));" 
         " background-image:image(#FF4300);" 
         " color: rgb(100.%, 100.%, 100.%);" 
         "}" 
         "#LSK0 { background-image: image(@bg); border-color: @bg }" 
         "#RSK0 { background-image: image(@bg); border-color: @bg }" 
         ".RunButton { background-image: image(rgb(80%, 80%, 80%)); color: rgb(0.%, 0.%, 0.%); }" 
        ); 

はまたことに注意してください"RunButton"スタイルのプロパティがクラス(.RunButton)として表示され、NOTがID(#RunButton)として表示されます。

これはウィンドウウィジェットのコンテキスト内でクラスとしてスタイルを追加しましたが、それはまだ何にも適用されません。その後、プログラムコードの実行や状態変化イベントに応答して、ウィジェットのスタイルはスタイルプロパティクラスの追加と削除によって更新される中:今すぐ

void GWin::onBtnLight(bool on) 
{ 
    if(on) 
    { 
     mRunButton.get_style_context()->add_class("RunButton"); 
    } 
    else 
    { 
     mRunButton.get_style_context()->remove_class("RunButton"); 
    } 
} 

間のウィジェットトグル上のボタンとラベルの色は、 RunButtonスタイルクラスとデフォルトのスタイルクラス。

関連する問題