2017-10-27 21 views
0

gtkmm3에 gtkmm2 응용 프로그램 중 일부를 포팅하기 시작했으며 변경에 대한 응답으로 응용 프로그램 내에서 위젯의 색상과 같은 속성을 변경하는 올바른 메커니즘이 명확하지 않습니다. 의 상태. 다음은 몇 가지 정의 된 상태에 따라 버튼 이미지와 텍스트의 색상을 뒤집을 수있는 방법을 보여주는 간단한 예입니다.gtkmm3/gtk3에서 위젯 prefperties 변경하기

창 (Gwin)을 만들고 짧은 CSS를 하드 코딩합니다 충분 문자열이 시작할 때 위젯의 시작 상태를 정의하려면 다음 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); 
} 

, 코드 관련 조각 된 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); 
} 

나는 주위를 둘러 보았지만 대부분의 질문과 답변은 실행 시작시 테마에 대해 한 번만 스타일 속성을 설정하거나 현재 사용되지 않는 override_ 메소드를 사용하는 것으로 제한됩니다.

질문을 주셔서 감사합니다.

답변

0

글쎄, thisthis과 같은 질문에서 더 많은 연구를 한 후에 내가 원하는 것을하는 올바른 방법이라고 생각하는 것을 발견했습니다. 문제의 위의() 주에서 업데이트

:

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.%); }" 
        ); 

이 또한주의

는 기본적으로 윈도우에 CSS 공급자를 추가 할 때 위젯 스타일이 개최하는 상태에 대한 속성을 정의 "RunButton"스타일의 속성은 이제 클래스 (.RunButton)로 표시되고 이 아닌은 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 스타일 클래스와 기본 스타일 클래스.