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_ 메소드를 사용하는 것으로 제한됩니다.
질문을 주셔서 감사합니다.