CSS 在 GTK 中 - 在单击按钮时更改背景颜色
CSS in GTK - changing background color on button click
我正在尝试使用 GTK 制作应用程序并使用 CSS 对其进行样式设置。我需要在点击时更改按钮背景。我需要这个来构建视频播放器。当我按下 'play' 时,我想通过更改 'play' 按钮背景来标记该视频正在播放,当我按下 'pause' 时,我想 'play' 按钮更改回默认值并且 'pause'按钮改变背景。当按下 'stop' 时,两个背景都应该回到默认状态。做出这种行为的最佳方式是什么?
我找到了函数 gtk_widget_override_background_color
,但它自 3.16 版起已被弃用,不应在新编写的代码中使用。
我也在 css 中尝试过 button:focus
,但它无法正常工作。它确实会在单击时更改背景颜色,但是当我单击不应影响背景的按钮(例如更改音量)时,背景会更改为默认值。
编辑。
我可能会以一种误导的方式问这个问题。 button:focus
按预期工作,但并不完全符合我的需要。让我解释一下示例:
1. 在开始时(选择视频后)我有空白屏幕并显示消息 "press play"
- 现在我按下播放键。播放按钮已添加 css 焦点
来自 C 的代码:
gtk_widget_set_name(GTK_WIDGET(play_button), "play_button_1");
在css中:
button#play_button_1:focus {
background-color: #67181B;
}
所以当我按下 "play" 时,播放器如下所示:
- 在我只使用按钮 "play"、"pause" 和 "stop" 之前它工作正常。但是当我按“+”或“-”(用于音量控制)时,"play" 按钮失去焦点,看起来像这样(视频仍在播放,图片上没有焦点在“-”按钮上,它是悬停的。屏幕截图上没有 coursor):
所以我想要实现的是,只要视频正在播放,背景就会保持 "play" 变化,而不管焦点在其他按钮上。我希望现在更清楚了
我找到了解决方案,虽然不是我想的最好的,但它很有效。如果有人有更好的东西,我会很高兴听到。
我制作了更多 css 个文件(针对每个应触发背景更改的函数的特定文件)。例如,当我有 "play" 按钮时,我创建了文件 play.css:
button#play_button_1 {
background-color: #67181B;
}
button#pause_button_1 {
background-color: #D5D6DB;
}
我添加了按钮功能
GtkCssProvider *provider;
GdkDisplay *display;
GdkScreen *screen;
provider = gtk_css_provider_new ();
display = gdk_display_get_default ();
screen = gdk_display_get_default_screen (display);
gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
const gchar* path_to_css = "play.css";
GError *error = 0;
gtk_css_provider_load_from_file(provider, g_file_new_for_path(path_to_css), &error);
然后我不得不对暂停按钮执行相同的操作(对其他文件),并在按下 "stop" 按钮时再次加载初始 css 文件。
我正在尝试使用 GTK 制作应用程序并使用 CSS 对其进行样式设置。我需要在点击时更改按钮背景。我需要这个来构建视频播放器。当我按下 'play' 时,我想通过更改 'play' 按钮背景来标记该视频正在播放,当我按下 'pause' 时,我想 'play' 按钮更改回默认值并且 'pause'按钮改变背景。当按下 'stop' 时,两个背景都应该回到默认状态。做出这种行为的最佳方式是什么?
我找到了函数 gtk_widget_override_background_color
,但它自 3.16 版起已被弃用,不应在新编写的代码中使用。
我也在 css 中尝试过 button:focus
,但它无法正常工作。它确实会在单击时更改背景颜色,但是当我单击不应影响背景的按钮(例如更改音量)时,背景会更改为默认值。
编辑。
我可能会以一种误导的方式问这个问题。 button:focus
按预期工作,但并不完全符合我的需要。让我解释一下示例:
1. 在开始时(选择视频后)我有空白屏幕并显示消息 "press play"
- 现在我按下播放键。播放按钮已添加 css 焦点
来自 C 的代码:
gtk_widget_set_name(GTK_WIDGET(play_button), "play_button_1");
在css中:
button#play_button_1:focus {
background-color: #67181B;
}
所以当我按下 "play" 时,播放器如下所示:
- 在我只使用按钮 "play"、"pause" 和 "stop" 之前它工作正常。但是当我按“+”或“-”(用于音量控制)时,"play" 按钮失去焦点,看起来像这样(视频仍在播放,图片上没有焦点在“-”按钮上,它是悬停的。屏幕截图上没有 coursor):
所以我想要实现的是,只要视频正在播放,背景就会保持 "play" 变化,而不管焦点在其他按钮上。我希望现在更清楚了
我找到了解决方案,虽然不是我想的最好的,但它很有效。如果有人有更好的东西,我会很高兴听到。 我制作了更多 css 个文件(针对每个应触发背景更改的函数的特定文件)。例如,当我有 "play" 按钮时,我创建了文件 play.css:
button#play_button_1 {
background-color: #67181B;
}
button#pause_button_1 {
background-color: #D5D6DB;
}
我添加了按钮功能
GtkCssProvider *provider;
GdkDisplay *display;
GdkScreen *screen;
provider = gtk_css_provider_new ();
display = gdk_display_get_default ();
screen = gdk_display_get_default_screen (display);
gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
const gchar* path_to_css = "play.css";
GError *error = 0;
gtk_css_provider_load_from_file(provider, g_file_new_for_path(path_to_css), &error);
然后我不得不对暂停按钮执行相同的操作(对其他文件),并在按下 "stop" 按钮时再次加载初始 css 文件。