我是Gtk + 3的新手。我习惯于使用Visual Basic设计GUI。我对Gtk遇到的所有麻烦感到非常沮丧,但我想我已经研究并解决了我所有的问题,只有一个。这是树莓派上最新的Gtk + 3,我用Glade整理了版面。目的是让各个标签在软件控制下更改背景颜色和文本颜色。请注意,这严格来说是一种显示-没有输入控件,只有网格,布局框和标签。
我几乎可以正常工作了。当我的代码运行时,它交替应用和删除给定的CSS样式。我可以看到结果。但是标签具有3个单独的有趣属性:标签本身的背景颜色,文本的背景颜色(文本未填充整个标签)以及文本本身的颜色。我的代码成功地更改了标签的背景和文本的颜色,但没有更改文本的背景。在所有情况下,我都需要文本背景以匹配标签背景。一种方法是使文本背景颜色始终透明。同时更改两种背景颜色将是另一种选择。我该怎么办?
这是感兴趣的CSS:
* {
background-color: black;
color: whitesmoke;
}
.redStyle {
background-color: rgb(182, 8, 8);
color: whitesmoke;
}
.pinkStyle {
background-color: rgb(241, 135, 135);
color: black;
}
测试代码从Gtk的空闲机制中交替调用这两个函数。
gboolean flashing1(void*)
{
GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object (builder, "labObsession"));
GtkStyleContext *context = gtk_widget_get_style_context(widget);
gtk_style_context_add_class(context,"pinkStyle");
gtk_widget_queue_draw(widget);
return false;
}
gboolean flashing2(void*)
{
GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object (builder, "labObsession"));
GtkStyleContext *context = gtk_widget_get_style_context(widget);
gtk_style_context_remove_class(context,"pinkStyle");
gtk_widget_queue_draw(widget);
return false;
}
请帮助。到现在为止,谷歌搜索了两两天。我知道有一个折旧的覆盖函数可能会执行此操作,但我正努力避免这种情况。
要获得额外的信用,为什么我会看到 **(a.out:26251):警告**:检索可访问性总线地址时出错:org.freedesktop.DBus.Error.ServiceUnknown:任何服务文件均未提供名称org.a11y.Bus。 每当我开始?
这是测试应用程序的完整代码:
#include <gtk/gtk.h>
#include <thread>
#include <iostream>
static GtkBuilder *builder;
gboolean flashing1(void*)
{
GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object (builder, "labObsession"));
GtkStyleContext *context = gtk_widget_get_style_context(widget);
gtk_style_context_add_class(context,"pinkStyle");
gtk_widget_queue_draw(widget);
return false;
}
gboolean flashing2(void*)
{
GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object (builder, "labObsession"));
GtkStyleContext *context = gtk_widget_get_style_context(widget);
gtk_style_context_remove_class(context,"pinkStyle");
gtk_widget_queue_draw(widget);
return false;
}
void flashingTh(GtkWidget*) //may need this param someday
{
for (;;)
{
usleep(50 * 1000);
gdk_threads_add_idle (flashing1, nullptr);
usleep(90 * 1000);
gdk_threads_add_idle (flashing2, nullptr);
}
}
int main(int argc, char *argv[])
{
GtkWidget *window;
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "randomness/Lachesis.glade", NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
gtk_builder_connect_signals(builder, NULL);
// g_object_unref(builder); //keep. needed to find things. Ugh.
//GtkStyleContext *context;
GtkCssProvider *provider = gtk_css_provider_new ();
gtk_css_provider_load_from_path (provider,
"randomness/lachesis.css",
nullptr);
gtk_style_context_add_provider_for_screen (gdk_screen_get_default(),
GTK_STYLE_PROVIDER(provider),
GTK_STYLE_PROVIDER_PRIORITY_USER);
gtk_widget_show(window);
std::thread(flashingTh, window).detach();
gtk_main();
return 0;
}
//not hooked up yet, signals can wait until painting works
// called when window is closed
void on_window_main_destroy()
{
gtk_main_quit();
}
这是.glade的片段:
<interface>
<requires lib="gtk+" version="3.0"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="title" translatable="yes">Lachesis</property>
<property name="window_position">center-always</property>
<property name="hide_titlebar_when_maximized">True</property>
<child>
<object class="GtkGrid" id="topGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="row_spacing">2</property>
<property name="column_spacing">2</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="labObsession">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Controller: unknown</property>
<attributes>
<attribute name="background" value="#000000000000"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
答案 0 :(得分:1)
事实证明,如果通过Glade定义标签并以这种方式设置属性,则您在代码中无法执行的任何操作(至少没有明显的改变)将更改文本的背景或前景色。不是CSS,不是折旧的函数,不是pango标记。我没有研究原因,我也不在乎-底线是,如果要对这些属性进行后续控制,请不要在林间中编辑属性。清除属性后,便可以使用标记字符串来控制代码中文本的颜色和背景。