在 gtkmm3 / gtk3 中以编程方式更改小部件预属性
Changing widget preoperties programmatically in gtkmm3 / gtk3
我已经开始将我的一些 gtkmm2 应用程序移植到 gtkmm3,但我不清楚从应用程序内更改小部件的属性(例如颜色)以响应状态更改的正确机制。这是一个简短的示例,说明了我正在尝试实现的目标,即根据某些定义的状态反转按钮图像和文本的颜色:
我创建了一个 window (Gwin) 并硬编码了一个短的 CSS 字符串,它足以定义小部件在启动时的开始状态:
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 class 中,相关代码段是以下信号处理程序,它在 mRunButton Gtk::Button 上运行,已使用 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_ 方法。
感谢您查看问题。
好吧,在对 this and 等问题进行更多研究后,我发现我认为是做我需要的事情的正确方法。
基本定义将 CSS 提供程序添加到 window 时小部件样式将保持的状态的属性:
从上述问题的 main() 更新:
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" 样式的属性现在列为 class (.RunButton) 和 NOT 作为 ID (#RunButton ).
这将样式作为 class 添加到 window 小部件的上下文中,但尚未将其应用于任何内容。然后在代码执行期间以编程方式响应状态更改事件,通过添加和删除样式来更新小部件样式 属性 classes:
void GWin::onBtnLight(bool on)
{
if(on)
{
mRunButton.get_style_context()->add_class("RunButton");
}
else
{
mRunButton.get_style_context()->remove_class("RunButton");
}
}
现在小部件上的按钮和标签颜色在 RunButton 样式 class 和默认样式 class 之间切换。
我已经开始将我的一些 gtkmm2 应用程序移植到 gtkmm3,但我不清楚从应用程序内更改小部件的属性(例如颜色)以响应状态更改的正确机制。这是一个简短的示例,说明了我正在尝试实现的目标,即根据某些定义的状态反转按钮图像和文本的颜色:
我创建了一个 window (Gwin) 并硬编码了一个短的 CSS 字符串,它足以定义小部件在启动时的开始状态:
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 class 中,相关代码段是以下信号处理程序,它在 mRunButton Gtk::Button 上运行,已使用 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_ 方法。
感谢您查看问题。
好吧,在对 this and
基本定义将 CSS 提供程序添加到 window 时小部件样式将保持的状态的属性:
从上述问题的 main() 更新:
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" 样式的属性现在列为 class (.RunButton) 和 NOT 作为 ID (#RunButton ).
这将样式作为 class 添加到 window 小部件的上下文中,但尚未将其应用于任何内容。然后在代码执行期间以编程方式响应状态更改事件,通过添加和删除样式来更新小部件样式 属性 classes:
void GWin::onBtnLight(bool on)
{
if(on)
{
mRunButton.get_style_context()->add_class("RunButton");
}
else
{
mRunButton.get_style_context()->remove_class("RunButton");
}
}
现在小部件上的按钮和标签颜色在 RunButton 样式 class 和默认样式 class 之间切换。